{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.574125Z",
     "start_time": "2025-02-06T01:49:36.203601Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:17.475510Z",
     "iopub.status.busy": "2025-02-07T04:56:17.475141Z",
     "iopub.status.idle": "2025-02-07T04:56:19.507622Z",
     "shell.execute_reply": "2025-02-07T04:56:19.507081Z",
     "shell.execute_reply.started": "2025-02-07T04:56:17.475485Z"
    },
    "id": "JHSdxPJuN4x7",
    "outputId": "a74dc274-dd24-4415-a3e4-1fcff4e437a2"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=10, micro=14, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cu124\n",
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n",
    "torch.manual_seed(seed)\n",
    "torch.cuda.manual_seed_all(seed)\n",
    "np.random.seed(seed)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.577108Z",
     "start_time": "2025-02-06T01:49:50.574125Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.509023Z",
     "iopub.status.busy": "2025-02-07T04:56:19.508507Z",
     "iopub.status.idle": "2025-02-07T04:56:19.511200Z",
     "shell.execute_reply": "2025-02-07T04:56:19.510723Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.509001Z"
    },
    "id": "yQQEArYqWylq",
    "outputId": "bc80eeee-442a-4ff2-f69e-348314f84bce"
   },
   "outputs": [],
   "source": [
    "#挂载谷歌云盘\n",
    "\n",
    "# from google.colab import drive\n",
    "# drive.mount('/content/drive')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.580504Z",
     "start_time": "2025-02-06T01:49:50.578113Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.511945Z",
     "iopub.status.busy": "2025-02-07T04:56:19.511757Z",
     "iopub.status.idle": "2025-02-07T04:56:19.514329Z",
     "shell.execute_reply": "2025-02-07T04:56:19.513892Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.511926Z"
    },
    "id": "wzS4AimwWz7f"
   },
   "outputs": [],
   "source": [
    "# !cp /content/drive/MyDrive/transformer-de-en/* . -r"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "55aNBForN4x9"
   },
   "source": [
    "## 数据加载\n",
    "\n",
    "- 采用WMT16的德语和英语平行语料库，数据集主页：[WMT16](https://www.statmt.org/wmt16/multimodal-task.html#task1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.583796Z",
     "start_time": "2025-02-06T01:49:50.581509Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.515765Z",
     "iopub.status.busy": "2025-02-07T04:56:19.515449Z",
     "iopub.status.idle": "2025-02-07T04:56:19.517771Z",
     "shell.execute_reply": "2025-02-07T04:56:19.517348Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.515746Z"
    },
    "id": "SkjBEbr1N4x-",
    "outputId": "4b9817d0-616b-41a0-ceb7-9ff6bf0f42a1"
   },
   "outputs": [],
   "source": [
    "#和jieba分词类似\n",
    "# !pip install sacremoses\n",
    "# !pip install subword-nmt\n",
    "# # BPE分词\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.587399Z",
     "start_time": "2025-02-06T01:49:50.585083Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.518589Z",
     "iopub.status.busy": "2025-02-07T04:56:19.518295Z",
     "iopub.status.idle": "2025-02-07T04:56:19.520565Z",
     "shell.execute_reply": "2025-02-07T04:56:19.520133Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.518571Z"
    },
    "id": "Tc8aCQX-XrGv",
    "outputId": "67964082-2737-4d47-dd66-455e4ae69660"
   },
   "outputs": [],
   "source": [
    "# !sh data_multi30k.sh wmt16 wmt16_cut de en"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Lvk4q0-1N4x-"
   },
   "source": [
    "Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.622578Z",
     "start_time": "2025-02-06T01:49:50.587399Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.521213Z",
     "iopub.status.busy": "2025-02-07T04:56:19.521052Z",
     "iopub.status.idle": "2025-02-07T04:56:19.540949Z",
     "shell.execute_reply": "2025-02-07T04:56:19.540417Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.521196Z"
    },
    "id": "zCXKEwspN4x_",
    "outputId": "3dcce6fa-932f-4b22-9dc8-398a4b402733"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load train dataset from wmt16/.cache/de2en_train_128.npy\n",
      "load val dataset from wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "\n",
    "class LangPairDataset(Dataset):\n",
    "\n",
    "    def __init__(\n",
    "        self, mode=\"train\", max_length=128, overwrite_cache=False, data_dir=\"wmt16\",\n",
    "    ):\n",
    "        self.data_dir = Path(data_dir)\n",
    "        cache_path = self.data_dir / \".cache\" / f\"de2en_{mode}_{max_length}.npy\"\n",
    "\n",
    "        if overwrite_cache or not cache_path.exists():\n",
    "            cache_path.parent.mkdir(parents=True, exist_ok=True) # 创建缓存目录\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_src.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.src = file.readlines() # 读取源语言文件所有行\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_trg.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.trg = file.readlines() # 读取目标语言文件所有行\n",
    "\n",
    "            filtered_src = []\n",
    "            filtered_trg = []\n",
    "            # max length filter,超出最大长度的句子舍弃\n",
    "            for src, trg in zip(self.src, self.trg):\n",
    "                if len(src) <= max_length and len(trg) <= max_length: # 过滤长度超过最大长度的句子\n",
    "                    filtered_src.append(src.strip()) # 去掉句子前后的空格\n",
    "                    filtered_trg.append(trg.strip())\n",
    "            filtered_src = np.array(filtered_src)\n",
    "            filtered_trg = np.array(filtered_trg)\n",
    "            np.save(\n",
    "                cache_path,\n",
    "                {\"src\": filtered_src, \"trg\": filtered_trg },\n",
    "                allow_pickle=True,\n",
    "            )#allow_pickle=True允许保存对象数组，将过滤后的数据保存为 NumPy 数组，存储在缓存文件中\n",
    "            print(f\"save cache to {cache_path}\")\n",
    "\n",
    "        else:\n",
    "            cache_dict = np.load(cache_path, allow_pickle=True).item() #allow_pickle=True允许保存对象数组\n",
    "            print(f\"load {mode} dataset from {cache_path}\")\n",
    "            filtered_src = cache_dict[\"src\"]\n",
    "            filtered_trg = cache_dict[\"trg\"]\n",
    "\n",
    "        self.src = filtered_src\n",
    "        self.trg = filtered_trg\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        return self.src[index], self.trg[index]\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.src)\n",
    "\n",
    "\n",
    "train_ds = LangPairDataset(\"train\")\n",
    "val_ds = LangPairDataset(\"val\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.625062Z",
     "start_time": "2025-02-06T01:49:50.622578Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.541620Z",
     "iopub.status.busy": "2025-02-07T04:56:19.541447Z",
     "iopub.status.idle": "2025-02-07T04:56:19.544374Z",
     "shell.execute_reply": "2025-02-07T04:56:19.543721Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.541602Z"
    },
    "id": "yHB9TDpDQlv2"
   },
   "outputs": [],
   "source": [
    "# !rm wmt16/.cache -r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.628422Z",
     "start_time": "2025-02-06T01:49:50.625062Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.545013Z",
     "iopub.status.busy": "2025-02-07T04:56:19.544851Z",
     "iopub.status.idle": "2025-02-07T04:56:19.549459Z",
     "shell.execute_reply": "2025-02-07T04:56:19.548908Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.544996Z"
    },
    "id": "meHHXL3MN4x_",
    "outputId": "a001c071-7021-4dff-8bc0-3e5da01d7210"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27962"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_ds) #少了1000多个样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.631146Z",
     "start_time": "2025-02-06T01:49:50.628422Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.550018Z",
     "iopub.status.busy": "2025-02-07T04:56:19.549853Z",
     "iopub.status.idle": "2025-02-07T04:56:19.553498Z",
     "shell.execute_reply": "2025-02-07T04:56:19.552848Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.550000Z"
    },
    "id": "LZvJV37NN4x_",
    "outputId": "43909dbd-cf15-447b-e8b6-a07de381ad0a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "source: ein älterer mann sitzt mit einem jungen mit einem wagen vor einer fassade .\n",
      "target: an elderly man sits outside a storefront accompanied by a young boy with a cart .\n"
     ]
    }
   ],
   "source": [
    "print(\"source: {}\\ntarget: {}\".format(*train_ds[-1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TE8gRzYQN4yA"
   },
   "source": [
    "### Tokenizer\n",
    "\n",
    "这里有两种处理方式，分别对应着 encoder 和 decoder 的 word embedding 是否共享，这里实现共享的方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.653532Z",
     "start_time": "2025-02-06T01:49:50.631146Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 66,
     "referenced_widgets": [
      "7190c928edb040c3a523cdd2e3f45572",
      "990741ff083d457587665d8f620b69c3",
      "00fe6a550df547cea5b1e0d84c1a3f5f",
      "fab8b1e3187841ee894b92859fa4821b",
      "f9b0d916e1a64c2a9f384e42f3d5dcab",
      "a78199650ecc47bd81f482a2671b563a",
      "673bd3773a374261a01cfc48081c27f3",
      "83f345f7424c43929d7a304cbfb6d0fe",
      "58d69d086f644e89937347e1f9261d6f",
      "8cf462fa996c41b18fb4571e0a757363",
      "434ac4c51db74681942d2d3bd869b1df"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.555958Z",
     "iopub.status.busy": "2025-02-07T04:56:19.555646Z",
     "iopub.status.idle": "2025-02-07T04:56:19.584274Z",
     "shell.execute_reply": "2025-02-07T04:56:19.583685Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.555939Z"
    },
    "id": "yAmlq_9YN4yA",
    "outputId": "263a89f7-9bee-4c6d-cf7a-7d82b0a81f92"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 18107/18107 [00:00<00:00, 926286.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vocab_size: 18111\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典,构建word2idx和idx2word\n",
    "word2idx = {\n",
    "    \"[PAD]\": 0,     # 填充 token\n",
    "    \"[BOS]\": 1,     # begin of sentence\n",
    "    \"[UNK]\": 2,     # 未知 token\n",
    "    \"[EOS]\": 3,     # end of sentence\n",
    "}\n",
    "idx2word = {value: key for key, value in word2idx.items()}\n",
    "index = len(idx2word)\n",
    "threshold = 1  # 出现次数低于此的token舍弃\n",
    "\n",
    "with open(\"wmt16/vocab\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in tqdm(file.readlines()):\n",
    "        token, counts = line.strip().split()\n",
    "        if int(counts) >= threshold:\n",
    "            word2idx[token] = index\n",
    "            idx2word[index] = token\n",
    "            index += 1\n",
    "\n",
    "vocab_size = len(word2idx)\n",
    "print(\"vocab_size: {}\".format(vocab_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.666914Z",
     "start_time": "2025-02-06T01:49:50.653532Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.584921Z",
     "iopub.status.busy": "2025-02-07T04:56:19.584760Z",
     "iopub.status.idle": "2025-02-07T04:56:19.596596Z",
     "shell.execute_reply": "2025-02-07T04:56:19.596118Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.584904Z"
    },
    "id": "e_ed0jmJN4yA",
    "outputId": "407a9e69-4981-42ae-c7a9-aa4c701185ef"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 9458, 3522,    3,    0,    0,    0])\n",
      "tensor([   1,    2, 5463,    2,   22,    2,    3])\n",
      "tensor([   1,  385,   18,    5, 5699,    3,    0])\n",
      "decode text\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with [UNK] [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=128, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx\n",
    "        self.idx2word = idx2word\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx\n",
    "        self.bos_idx = bos_idx\n",
    "        self.eos_idx = eos_idx\n",
    "        self.unk_idx = unk_idx\n",
    "\n",
    "    def encode(self, text_list, padding_first=False, add_bos=True, add_eos=True, return_mask=False):\n",
    "        \"\"\"如果padding_first == True，则padding加载前面，否则加载后面\"\"\"\n",
    "        max_length = min(self.max_length, add_eos + add_bos + max([len(text) for text in text_list]))\n",
    "        indices_list = []\n",
    "        for text in text_list:\n",
    "            indices = [self.word2idx.get(word, self.unk_idx) for word in text[:max_length - add_bos - add_eos]]\n",
    "            if add_bos:\n",
    "                indices = [self.bos_idx] + indices\n",
    "            if add_eos:\n",
    "                indices = indices + [self.eos_idx]\n",
    "            if padding_first:\n",
    "                indices = [self.pad_idx] * (max_length - len(indices)) + indices\n",
    "            else:\n",
    "                indices = indices + [self.pad_idx] * (max_length - len(indices))\n",
    "            indices_list.append(indices)\n",
    "        input_ids = torch.tensor(indices_list)\n",
    "        masks = (input_ids == self.pad_idx).to(dtype=torch.int64) # 为了方便损失计算，这里的mask为0的地方需要计算，为1的地方不需要计算\n",
    "        return input_ids if not return_mask else (input_ids, masks)\n",
    "\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "\n",
    "\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text, padding_first=False, add_bos=True, add_eos=True)\n",
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)\n",
    "print(\"decode text\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.670059Z",
     "start_time": "2025-02-06T01:49:50.666914Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.597224Z",
     "iopub.status.busy": "2025-02-07T04:56:19.597064Z",
     "iopub.status.idle": "2025-02-07T04:56:19.600635Z",
     "shell.execute_reply": "2025-02-07T04:56:19.599998Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.597206Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "66\n",
      "54\n"
     ]
    }
   ],
   "source": [
    "for i,j in train_ds:\n",
    "    print(len(i))\n",
    "    print(len(j))\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ftcEnnKxN4yB"
   },
   "source": [
    "### Transformer Batch Sampler\n",
    "\n",
    "> Sentence pairs were batched together by approximate sequence length. Each training batch contained a set of sentence pairs containing approximately 25000 source tokens and 25000 target tokens\n",
    "句子按照序列长度差不多的分到一个批次。 每个训练批次包含一组句子对，其中包含大约 25000 个源标记和 25000 个目标标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.674404Z",
     "start_time": "2025-02-06T01:49:50.670059Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.601207Z",
     "iopub.status.busy": "2025-02-07T04:56:19.601045Z",
     "iopub.status.idle": "2025-02-07T04:56:19.607611Z",
     "shell.execute_reply": "2025-02-07T04:56:19.606965Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.601190Z"
    },
    "id": "qP8nznIuN4yB"
   },
   "outputs": [],
   "source": [
    "class SampleInfo: #下面的info对象\n",
    "    def __init__(self, i, lens):\n",
    "        \"\"\"\n",
    "        记录文本对的序号和长度信息\n",
    "        输入：\n",
    "            - i (int): 文本对的序号。\n",
    "            - lens (list): 文本对源语言和目标语言的长度\n",
    "        \"\"\"\n",
    "        self.i = i\n",
    "        # 加一是考虑填补在文本前后的特殊词元，lens[0]和lens[1]分别表示源语言和目标语言的长度\n",
    "        self.max_len = max(lens[0], lens[1]) + 1\n",
    "        self.src_len = lens[0] + 1\n",
    "        self.trg_len = lens[1] + 1\n",
    "\n",
    "# 一个批量生成器，根据词元数目的限制来控制批量的大小。它会根据传入的样本信息，在不超过设定大小的情况下，逐步构建批量。\n",
    "class TokenBatchCreator:\n",
    "    def __init__(self, batch_size):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        batch_size (int): 用于限制批量的大小。\n",
    "        功能:\n",
    "        初始化了一个空的批量列表 _batch。\n",
    "        设定了初始的最大长度为 -1。\n",
    "        存储了传入的 batch_size。\n",
    "        \"\"\"\n",
    "\n",
    "        self._batch = []  #这个就是之前的batch_size，就是第一个batch内有多少个样本\n",
    "        self.max_len = -1\n",
    "        self._batch_size = batch_size # 限制批量的大小,假设是4096\n",
    "\n",
    "    def append(self, info: SampleInfo):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        info (SampleInfo): 文本对的信息。\n",
    "        功能:\n",
    "        接收一个 SampleInfo 对象，并根据其最大长度信息更新当前批量的最大长度。\n",
    "        如果将新的样本加入批量后超过了批量大小限制，它会返回已有的批量并将新的样本加入新的批量。\n",
    "        否则，它会更新最大长度并将样本添加到当前批量中。\n",
    "        \"\"\"\n",
    "        # 更新当前批量的最大长度\n",
    "        cur_len = info.max_len # 当前样本的长度\n",
    "        max_len = max(self.max_len, cur_len) # 每来一个样本，更新当前批次的最大长度\n",
    "        # 如果新的样本加入批量后超过大小限制，则将已有的批量返回，新的样本加入新的批量\n",
    "        if max_len * (len(self._batch) + 1) > self._batch_size:\n",
    "            self._batch, result = [], self._batch # 保存当前的batch，并返回,这里的result是之前的batch,_batch清空\n",
    "            self._batch.append(info) #箱子里的第一条样本，放入\n",
    "            self.max_len = cur_len #因为是当前batch的第一个样本，所以它的长度就是当前长度\n",
    "            return result\n",
    "        else:\n",
    "            self.max_len = max_len\n",
    "            self._batch.append(info) # 将样本添加到当前批量中\n",
    "            return None\n",
    "\n",
    "    @property\n",
    "    def batch(self):\n",
    "        return self._batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.680427Z",
     "start_time": "2025-02-06T01:49:50.676008Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.608274Z",
     "iopub.status.busy": "2025-02-07T04:56:19.608103Z",
     "iopub.status.idle": "2025-02-07T04:56:19.616463Z",
     "shell.execute_reply": "2025-02-07T04:56:19.615822Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.608255Z"
    },
    "id": "_Vtc0gXEN4yB"
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import BatchSampler\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "class TransformerBatchSampler(BatchSampler):\n",
    "    def __init__(self,\n",
    "                 dataset,\n",
    "                 batch_size,\n",
    "                 shuffle_batch=False,\n",
    "                 clip_last_batch=False,\n",
    "                 seed=0):\n",
    "        \"\"\"\n",
    "        批量采样器\n",
    "        输入:\n",
    "            - dataset: 数据集\n",
    "            - batch_size: 批量大小\n",
    "            - shuffle_batch: 是否对生成的批量进行洗牌\n",
    "            - clip_last_batch: 是否裁剪最后剩下的数据\n",
    "            - seed: 随机数种子\n",
    "        \"\"\"\n",
    "        self._dataset = dataset\n",
    "        self._batch_size = batch_size\n",
    "        self._shuffle_batch = shuffle_batch\n",
    "        self._clip_last_batch = clip_last_batch\n",
    "        self._seed = seed #下面3个是为了随机\n",
    "        self._random = np.random\n",
    "        self._random.seed(seed)\n",
    "\n",
    "        self._sample_infos = []\n",
    "        # 根据数据集中的每个样本，创建了对应的 SampleInfo 对象，包含了样本的索引和长度信息。\n",
    "        for i, data in enumerate(self._dataset):\n",
    "            lens = [len(data[0]), len(data[1])] #输入和输出的长度计算放到lens中\n",
    "            self._sample_infos.append(SampleInfo(i, lens))\n",
    "\n",
    "    def __iter__(self):\n",
    "        \"\"\"\n",
    "        对数据集中的样本进行排序，排序规则是先按源语言长度排序，如果相同则按目标语言长度排序。\n",
    "        使用 TokenBatchCreator 逐步组装批量数据，当满足批量大小时返回一个批量的样本信息。\n",
    "        如果不裁剪最后一个批次的数据且存在剩余样本，则将这些样本组成最后一个批次。\n",
    "        如果需要对批量进行洗牌，则对批次进行洗牌操作。\n",
    "        通过迭代器，抛出每个批量的样本在数据集中的索引。\n",
    "        \"\"\"\n",
    "        # 排序，如果源语言长度相同则按照目标语言的长度排列\n",
    "        infos = sorted(self._sample_infos,\n",
    "                       key=lambda x: (x.src_len, x.trg_len))\n",
    "        # 把样本放入到箱子里，所有装箱后的箱子，每一个箱子都放入batch_infos\n",
    "        batch_infos = []\n",
    "        batch_creator = TokenBatchCreator(self._batch_size) # 批量生成器\n",
    "        for info in infos:\n",
    "            batch = batch_creator.append(info)\n",
    "            # 存够一个batch的样本信息后，会把这个batch返回，否则返回为None\n",
    "            if batch is not None:\n",
    "                batch_infos.append(batch)\n",
    "\n",
    "        # 是否抛弃最后批量的文本对\n",
    "        if not self._clip_last_batch and len(batch_creator.batch) != 0:\n",
    "            batch_infos.append(batch_creator.batch) # 最后一个batch\n",
    "\n",
    "        # 打乱batch，打乱的是箱子的顺序\n",
    "        if self._shuffle_batch:\n",
    "            self._random.shuffle(batch_infos)\n",
    "\n",
    "        self.batch_number = len(batch_infos)\n",
    "        # print(self.batch_number) #为了理解\n",
    "\n",
    "        # 抛出一个箱子里所有样本的序号\n",
    "        for batch in batch_infos:\n",
    "            batch_indices = [info.i for info in batch] # 批量的样本在数据集中的索引，第一个batch[0,1,.....82]，第二个batch[83,84,85,86,87]\n",
    "            yield batch_indices\n",
    "\n",
    "    def __len__(self):\n",
    "        \"\"\"\n",
    "        返回批量的数量\n",
    "        \"\"\"\n",
    "        if hasattr(self, \"batch_number\"):\n",
    "            return self.batch_number\n",
    "        # 计算批量的数量,没有用到下面的情况，不用看\n",
    "        batch_number = (len(self._dataset) +\n",
    "                        self._batch_size) // self._batch_size\n",
    "        return batch_number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.725998Z",
     "start_time": "2025-02-06T01:49:50.680427Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.617109Z",
     "iopub.status.busy": "2025-02-07T04:56:19.616944Z",
     "iopub.status.idle": "2025-02-07T04:56:19.760323Z",
     "shell.execute_reply": "2025-02-07T04:56:19.759817Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.617091Z"
    },
    "id": "d00AFRzVN4yC",
    "outputId": "a43c1a14-102f-4cbb-fff1-761cb46e31b3"
   },
   "outputs": [],
   "source": [
    "sampler = TransformerBatchSampler(train_ds, batch_size=4096, shuffle_batch=True)\n",
    "\n",
    "#为什么这里每个批量的样本对数目不一样呢？长度*batch_number>4096的时候，就会返回上一个batch，然后新的样本加入新的batch,具体要看TokenBatchCreator的44行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.750597Z",
     "start_time": "2025-02-06T01:49:50.727002Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.761086Z",
     "iopub.status.busy": "2025-02-07T04:56:19.760904Z",
     "iopub.status.idle": "2025-02-07T04:56:19.798712Z",
     "shell.execute_reply": "2025-02-07T04:56:19.798007Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.761065Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[26845, 982, 1864, 3222, 4716, 5341, 5897, 6103, 8531, 10067, 11125, 13063, 14929, 15158, 18063, 18502, 20661, 20986, 21320, 22030, 22882, 23567, 24909, 1881, 2268, 4268, 7413, 10166, 12447, 13573, 15332, 16727, 17657, 20829, 21508, 23094, 24274, 25801, 518, 2145, 4111, 4739, 4745, 7493, 7623, 8369, 8618, 8730, 9054, 9391, 9808, 10141, 10412, 11422, 13534, 15038]\n"
     ]
    }
   ],
   "source": [
    "for i in sampler:\n",
    "    print(i)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.776565Z",
     "start_time": "2025-02-06T01:49:50.751603Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.799734Z",
     "iopub.status.busy": "2025-02-07T04:56:19.799378Z",
     "iopub.status.idle": "2025-02-07T04:56:19.835534Z",
     "shell.execute_reply": "2025-02-07T04:56:19.835021Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.799713Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0批量的数据中含有文本对是：[21271, 22083, 25959, 49, 637, 6773, 8687, 16391, 19042, 22788, 22867, 27194, 2246, 11350, 12499, 14881, 16713, 20199, 17560, 23179, 6216, 18973, 19368, 25486, 15211, 17452, 17890, 19236, 25288, 27115, 2627, 19805, 755, 10914, 16360, 21301, 27624, 7114]，数量为：38\n",
      "第1批量的数据中含有文本对是：[25919, 26342, 1164, 1463, 4572, 4601, 4923, 5629, 10667, 12481, 13313, 13485, 15766, 16256, 19927, 20233, 21061, 27843, 1040, 2768, 4096, 5842, 5847, 6265, 6663, 8346, 8481, 10076, 14832, 17516, 18001, 21196, 22517, 23172, 23181, 23604, 27227, 27892, 3, 120, 607, 2870, 3270, 9536, 10044, 11085, 15960, 21744, 22156, 22189, 24491, 27443, 151]，数量为：53\n",
      "第2批量的数据中含有文本对是：[23598, 26090, 26756, 27395, 6244, 10461, 12839, 16355, 20300, 21417, 26565, 4264, 4307, 6294, 7085, 9525, 9559, 9647, 9710, 10344, 12214, 13075, 13337, 13691, 16381, 19796, 21830, 23531, 25014, 25921, 27752, 1850, 4221, 5306, 8341, 8859, 9052, 10025, 11858, 11948, 15347, 15812, 18069, 18469, 22704, 23203, 23537, 26233, 26928, 27214, 179, 1745, 4982]，数量为：53\n",
      "第3批量的数据中含有文本对是：[17510, 26533, 12808, 1291, 11297, 19038, 24464, 1494, 3332, 3655, 15580, 24842, 1275, 7737, 16751, 16762, 21651, 24549, 25529, 26103, 4049, 4332, 23891, 24659, 25552, 27437, 1112, 6020, 24492, 14171, 17259, 19267, 26181, 26556, 2919, 3983, 998, 26712, 24446]，数量为：39\n"
     ]
    }
   ],
   "source": [
    "for idx, batch in enumerate(sampler):\n",
    "    print(\"第{}批量的数据中含有文本对是：{}，数量为：{}\".format(idx, batch, len(batch)))\n",
    "    if idx >= 3:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.779581Z",
     "start_time": "2025-02-06T01:49:50.776565Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.836741Z",
     "iopub.status.busy": "2025-02-07T04:56:19.836257Z",
     "iopub.status.idle": "2025-02-07T04:56:19.840479Z",
     "shell.execute_reply": "2025-02-07T04:56:19.839932Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.836709Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "527"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(sampler)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Olkaw4JNN4yC"
   },
   "source": [
    "### DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.782910Z",
     "start_time": "2025-02-06T01:49:50.779581Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.841568Z",
     "iopub.status.busy": "2025-02-07T04:56:19.841187Z",
     "iopub.status.idle": "2025-02-07T04:56:19.846687Z",
     "shell.execute_reply": "2025-02-07T04:56:19.846211Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.841538Z"
    },
    "id": "rvvuNJIzN4yC"
   },
   "outputs": [],
   "source": [
    "def collate_fct(batch, tokenizer):\n",
    "    src_words = [pair[0].split() for pair in batch]\n",
    "    trg_words = [pair[1].split() for pair in batch]\n",
    "\n",
    "    # [BOS] src [EOS] [PAD]\n",
    "    encoder_inputs, encoder_inputs_mask = tokenizer.encode(\n",
    "        src_words, padding_first=False, add_bos=True, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    # [BOS] trg [PAD]\n",
    "    decoder_inputs = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=True, add_eos=False, return_mask=False,\n",
    "        )\n",
    "\n",
    "    # trg [EOS] [PAD]\n",
    "    decoder_labels, decoder_labels_mask = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=False, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    return {\n",
    "        \"encoder_inputs\": encoder_inputs.to(device=device),\n",
    "        \"encoder_inputs_mask\": encoder_inputs_mask.to(device=device),\n",
    "        \"decoder_inputs\": decoder_inputs.to(device=device),\n",
    "        \"decoder_labels\": decoder_labels.to(device=device),\n",
    "        \"decoder_labels_mask\": decoder_labels_mask.to(device=device),\n",
    "    }\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.830190Z",
     "start_time": "2025-02-06T01:49:50.782910Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:19.847633Z",
     "iopub.status.busy": "2025-02-07T04:56:19.847280Z",
     "iopub.status.idle": "2025-02-07T04:56:20.015118Z",
     "shell.execute_reply": "2025-02-07T04:56:20.014609Z",
     "shell.execute_reply.started": "2025-02-07T04:56:19.847612Z"
    },
    "id": "5p79gPo5N4yC",
    "outputId": "2b1d43ae-a2ed-4333-8274-50c62c2fc6c9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "encoder_inputs\n",
      "tensor([[    1,     7,    17,     6,  4636,  3116,    31, 13407,     4,     3,\n",
      "             0,     0,     0],\n",
      "        [    1,  1310,    12,  2275,  6752,  1029,  8834, 13522,     4,     3,\n",
      "             0,     0,     0],\n",
      "        [    1,    84,    58,   172,   288,     9,    29,    98,    12,    21,\n",
      "            52,     4,     3],\n",
      "        [    1,    17,     6,   488,   442,    12,   499,   199,    73,    11,\n",
      "           235,     4,     3]], device='cuda:0')\n",
      "encoder_inputs_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], device='cuda:0')\n",
      "decoder_inputs\n",
      "tensor([[   1,    5,  324,   36, 2123,  672,   18, 2497,    5, 3739, 2933,    4,\n",
      "            0,    0],\n",
      "        [   1,    5, 1270,   19, 2409,   30, 2698,  307,  136, 1213, 1174,    4,\n",
      "            0,    0],\n",
      "        [   1,   87,   51,   30,  242,    9,   28,   53,   19,   83,   62,    4,\n",
      "            0,    0],\n",
      "        [   1,    5,   16,   36,    5,   45,  362,   19,   55,   80,  265,    5,\n",
      "          219,    4]], device='cuda:0')\n",
      "decoder_labels\n",
      "tensor([[   5,  324,   36, 2123,  672,   18, 2497,    5, 3739, 2933,    4,    3,\n",
      "            0,    0],\n",
      "        [   5, 1270,   19, 2409,   30, 2698,  307,  136, 1213, 1174,    4,    3,\n",
      "            0,    0],\n",
      "        [  87,   51,   30,  242,    9,   28,   53,   19,   83,   62,    4,    3,\n",
      "            0,    0],\n",
      "        [   5,   16,   36,    5,   45,  362,   19,   55,   80,  265,    5,  219,\n",
      "            4,    3]], device='cuda:0')\n",
      "decoder_labels_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], device='cuda:0')\n"
     ]
    }
   ],
   "source": [
    "from functools import partial # 固定collate_fct的tokenizer参数\n",
    "\n",
    "#可以调大batch_size,来看最终的bleu，如果GPU内存不够，可以减小batch_size\n",
    "sampler = TransformerBatchSampler(train_ds, batch_size=256, shuffle_batch=True)\n",
    "# https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader\n",
    "sample_dl = DataLoader(train_ds, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer)) #partial函数，固定collate_fct的tokenizer参数\n",
    "\n",
    "for batch in sample_dl:#外层是拿每个batch\n",
    "    for key, value in batch.items():#内层是拿每个batch里面是一个字典\n",
    "        print(key)\n",
    "        print(value)\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0AadtoM3N4yC"
   },
   "source": [
    "## 定义模型\n",
    "\n",
    "- Transformer模型由Embedding、Transformer-Block组成\n",
    "- Embedding包括：\n",
    "    - WordEmbedding\n",
    "    - PositionEmbedding\n",
    "- Transformer-Block包括：\n",
    "    - Self-Attention\n",
    "    - Cross-Attention\n",
    "    - MLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VTl-sSJmN4yD"
   },
   "source": [
    "### Embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.834899Z",
     "start_time": "2025-02-06T01:49:50.831210Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:20.016107Z",
     "iopub.status.busy": "2025-02-07T04:56:20.015690Z",
     "iopub.status.idle": "2025-02-07T04:56:20.019732Z",
     "shell.execute_reply": "2025-02-07T04:56:20.019219Z",
     "shell.execute_reply.started": "2025-02-07T04:56:20.016087Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([128, 1])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.arange(0, 128).unsqueeze(1).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.956649Z",
     "start_time": "2025-02-06T01:49:50.834899Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 455
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:13.357217Z",
     "iopub.status.busy": "2025-02-07T05:28:13.356608Z",
     "iopub.status.idle": "2025-02-07T05:28:13.504264Z",
     "shell.execute_reply": "2025-02-07T05:28:13.503724Z",
     "shell.execute_reply.started": "2025-02-07T05:28:13.357192Z"
    },
    "id": "y66CxrsBN4yD",
    "outputId": "c703025c-afc5-4012-d8e3-0e9d4ad253ec",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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dVISv4Z43aR2NNrJyxtvvIGsrCxMmzYN69atQ48ePTB48OCTdvdryKxatQoTJkzA6tWrsWzZMlRUVOCiiy5CcXGxqjN58mS8//77ePPNN7Fq1Srs2bMHV111VRBHXbd88803eOGFF9C9e3dTeWO87sOHD+Pcc8+Fw+HAxx9/jJ9//hn//Oc/ERcXp+pUJyV9Q+PRRx/F888/j2effRYbN27Eo48+isceewzPPPOMqtMYrru4uBg9evTA3LlzfR6vzjWOHDkSGzZswLJly/DBBx/giy++wPjx48/UJQREVdddUlKCdevW4YEHHsC6devw9ttvY9OmTbj88stN9RridZNaUqNMSA2Ifv36GRMmTFA/ezweIzU11Zg1a1YQR3V62bdvnwHAWLVqlWEYhpGfn284HA7jzTffVHU2btxoADCys7ODNcw648iRI0b79u2NZcuWGX/84x+NO+64wzCMxnvd9957rzFgwAC/x71er5GcnGw8/vjjqiw/P99wuVzGv//97zMxxNPC0KFDjb/85S+msquuusoYOXKkYRiN87oBGO+88476uTrX+PPPPxsAjG+++UbV+fjjjw2LxWLs3r37jI29Npx43b5Yu3atAcDYsWOHYRiN47pJzWmUKy/l5eXIyckxpea2Wq3IzMxEdnZ2EEd2ejm+WVB8fDwAICcnBxUVFab70KlTJ7Rs2bJR3IcJEyZg6NChpusDGu91v/fee+jbty+uvvpqNG3aFL169cJLL72kjp8qJX1DpX///li+fDl+/fVXAMD333+PL7/8EhdffDGAxnvdOtW5xuzsbMTGxqJv376qTmZmJqxWK9asWXPGx3y6KCgogMViQWxsLIDQuW5ipt7vsBsIBw4cgMfjOWkX3qSkJPzyyy9BGtXpxev1YtKkSTj33HPRtWtXAEBubi6cTqf6JT9OUlIScnNzgzDKumPx4sVYt24dvvnmm5OONdbr/u233/D8888jKysLf/vb3/DNN9/g9ttvh9PpxOjRo9W1+frcN+Trvu+++1BYWIhOnTrBZrPB4/HgoYcewsiRIwGg0V63TnWuMTc3F02bNjUdt9vtiI+PbzT3obS0FPfeey+uu+46lZgxFK6bnEyjnLyEIhMmTMBPP/2EL7/8MthDOe3s2rULd9xxB5YtW3bGs7IGE6/Xi759++Lhhx8GcGy77p9++gnz5s3D6NGjgzy608d//vMfvP7661i0aBHOOussrF+/HpMmTUJqamqjvm5ipqKiAtdccw0Mw8Dzzz8f7OGQINMoHxs1adIENpvtJHdJXl5ejdNuNwQmTpyIDz74AJ9//jmaN2+uypOTk1FeXo78/HxT/YZ+H3JycrBv3z707t0bdrsddrsdq1atwpw5c2C325GUlNQorzslJQVdunQxlXXu3Bk7d+4EYE5Jr9PQr/vuu+/GfffdhxEjRqBbt27485//jMmTJ2PWrFkAGu9161TnGpOTk08yJFRWVuLQoUMN/j4cn7js2LEDy5YtU6suQOO+buKfRjl5cTqd6NOnD5YvX67KvF4vli9fjoyMjCCOrG4xDAMTJ07EO++8gxUrVqB169am43369IHD4TDdh02bNmHnzp0N+j4MGjQIP/74o8pyun79evTt2xcjR45UujFe97nnnnuSFf7XX39Fq1atAJhT0h/neEr6hnzdJSUlsFrNf6psNhu8Xi+AxnvdOtW5xoyMDOTn5yMnJ0fVWbFiBbxeL9LT08/4mOuK4xOXzZs347PPPkNCQoLpeGO9bnIKgh0xfLpYvHix4XK5jFdeecX4+eefjfHjxxuxsbFGbm5usIdWZ9xyyy1GTEyMsXLlSmPv3r3qVVJSourcfPPNRsuWLY0VK1YY3377rZGRkWFkZGQEcdSnB91tZBiN87rXrl1r2O1246GHHjI2b95svP7660Z4eLjxr3/9S9V55JFHjNjYWOPdd981fvjhB+OKK64wWrdubRw9ejSII68do0ePNpo1a2Z88MEHxrZt24y3337baNKkiXHPPfeoOo3huo8cOWJ89913xnfffWcAMJ588knju+++U66a6lzjkCFDjF69ehlr1qwxvvzyS6N9+/bGddddF6xLqhZVXXd5eblx+eWXG82bNzfWr19v+jtXVlam+miI101qR6OdvBiGYTzzzDNGy5YtDafTafTr189YvXp1sIdUpwDw+Vq4cKGqc/ToUePWW2814uLijPDwcOPKK6809u7dG7xBnyZOnLw01ut+//33ja5duxoul8vo1KmT8eKLL5qOe71e44EHHjCSkpIMl8tlDBo0yNi0aVOQRls3FBYWGnfccYfRsmVLw+12G23atDH+/ve/m/7zagzX/fnnn/v8fR49erRhGNW7xoMHDxrXXXedERkZaURHRxtjxowxjhw5EoSrqT5VXfe2bdv8/p37/PPPVR8N8bpJ7bAYhrZNJSGEEEJIPadRxrwQQgghpPHCyQshhBBCGhScvBBCCCGkQcHJCyGEEEIaFJy8EEIIIaRBwckLIYQQQhoUnLwQQgghpEHByQshpFps374dFosF69evD/ZQCCEhDicvhDQQbrzxRlgsFlgsFjgcDiQlJeHCCy/EggULVJ6fujzXsGHD6rRPQgipKzh5IaQBMWTIEOzduxfbt2/Hxx9/jAsuuAB33HEHLr30UlRWVgZ7eIQQckbg5IWQBoTL5UJycjKaNWuG3r17429/+xveffddfPzxx3jllVcAAPn5+bjpppuQmJiI6OhoDBw4EN9//73qY/r06ejZsydeeOEFtGjRAuHh4bjmmmtQUFCgjr/66qt499131UrPypUrVfvffvsNF1xwAcLDw9GjRw9kZ2efyVtACCGcvBDS0Bk4cCB69OiBt99+GwBw9dVXY9++ffj444+Rk5OD3r17Y9CgQTh06JBqs2XLFvznP//B+++/j6VLl+K7777DrbfeCgC46667cM0116hVnr1796J///6q7d///nfcddddWL9+PTp06IDrrruOqz6EkDMKJy+ENAI6deqE7du348svv8TatWvx5ptvom/fvmjfvj2eeOIJxMbG4q233lL1S0tL8dprr6Fnz54477zz8Mwzz2Dx4sXIzc1FZGQkwsLC1CpPcnIynE6nanvXXXdh6NCh6NChA2bMmIEdO3Zgy5YtwbhsQkiIwskLIY0AwzBgsVjw/fffo6ioCAkJCYiMjFSvbdu2YevWrap+y5Yt0axZM/VzRkYGvF4vNm3adMpzde/eXemUlBQAwL59++rwagghpGrswR4AIaT2bNy4Ea1bt0ZRURFSUlJMMSrHiY2NrZNzORwOpS0WCwDUuduJEEKqgpMXQho4K1aswI8//ojJkyejefPmyM3Nhd1uR1pamt82O3fuxJ49e5CamgoAWL16NaxWKzp27AgAcDqd8Hg8Z2L4hBBSYzh5IaQBUVZWhtzcXHg8HuTl5WHp0qWYNWsWLr30UowaNQpWqxUZGRkYNmwYHnvsMXTo0AF79uzBhx9+iCuvvBJ9+/YFALjdbowePRpPPPEECgsLcfvtt+Oaa65BcnIyACAtLQ2ffPIJNm3ahISEBMTExATzsgkhxAQnL4Q0IJYuXYqUlBTY7XbExcWhR48emDNnDkaPHg2r9VgI20cffYS///3vGDNmDPbv34/k5GScd955SEpKUv20a9cOV111FS655BIcOnQIl156KZ577jl1fNy4cVi5ciX69u2LoqIifP7551Wu5BBCyJnEYhiGEexBEELOHNOnT8eSJUu4zT8hpMFCtxEhhBBCGhScvBBCCCGkQcHHRoQQQghpUHDlhRBCCCENCk5eCCGEENKg4OSFEEIIIQ0KTl4IIYQQ0qDg5IUQQgghDQpOXgghhBDSoODkhRBCCCENCk5eCCGEENKg4OSFEEIIIQ2K/wcnumZWHU5nbgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "class TransformerEmbedding(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.hidden_size = config[\"d_model\"] # 词向量维度\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "\n",
    "        # layers,设置padding_idx可以让pad的词向量全为0\n",
    "        self.word_embedding = nn.Embedding(\n",
    "            self.vocab_size, self.hidden_size, padding_idx=self.pad_idx\n",
    "        )\n",
    "        self.pos_embedding = nn.Embedding(\n",
    "            self.max_length,\n",
    "            self.hidden_size,\n",
    "            _weight=self.get_positional_encoding(\n",
    "                self.max_length, self.hidden_size\n",
    "            ),# 位置编码，权重通过get_positional_encoding函数计算得到\n",
    "        )\n",
    "        self.pos_embedding.weight.requires_grad_(False) # 不更新位置编码的权重\n",
    "        self.dropout = nn.Dropout(dropout_rate) # 随机失活层\n",
    "\n",
    "    def get_word_embedding_weights(self):\n",
    "        return self.word_embedding.weight\n",
    "\n",
    "    # 计算位置信息\n",
    "    @classmethod\n",
    "    def get_positional_encoding(self, max_length, hidden_size):#max_length是最大长度，hidden_size是embedding维度相等\n",
    "        # Compute the positional encodings once in log space.\n",
    "        pe = torch.zeros(max_length, hidden_size) # 初始化位置编码\n",
    "        # .unsqueeze(1) 是将这个一维张量转换为二维张量，即将其形状从 (max_length,) 变为 (max_length, 1)。这个操作在张量的维度上增加了一个维度，使其从一维变为二维，第二维的大小为 1。\n",
    "        position = torch.arange(0, max_length).unsqueeze(1) # 位置信息,从0到max_length-1\n",
    "        div_term = torch.exp(\n",
    "            torch.arange(0, hidden_size, 2)\n",
    "            * -(torch.log(torch.Tensor([10000.0])) / hidden_size)\n",
    "        )# 计算位置编码的权重,为了性能考量（是数学上的对数函数分解）\n",
    "        pe[:, 0::2] = torch.sin(position * div_term)\n",
    "        pe[:, 1::2] = torch.cos(position * div_term)\n",
    "        return pe\n",
    "\n",
    "    def forward(self, input_ids):\n",
    "        # input_ids: [batch_size, seq_len]\n",
    "        seq_len = input_ids.shape[1]\n",
    "        assert (\n",
    "            seq_len <= self.max_length\n",
    "        ), f\"input sequence length should no more than {self.max_length} but got {seq_len}\"\n",
    "\n",
    "        position_ids = torch.arange(seq_len, dtype=torch.long, device=input_ids.device)\n",
    "        position_ids = position_ids.unsqueeze(0).expand_as(input_ids)\n",
    "        # print(position_ids) #为了调试\n",
    "        # embedding\n",
    "        word_embeds = self.word_embedding(input_ids) # 词嵌入\n",
    "        pos_embeds = self.pos_embedding(position_ids) # 位置编码\n",
    "        embeds = word_embeds + pos_embeds\n",
    "        embeds = self.dropout(embeds)\n",
    "\n",
    "        return embeds\n",
    "\n",
    "\n",
    "def plot_position_embedding(position_embedding):# 绘制位置编码\n",
    "    plt.pcolormesh(position_embedding) # 绘制位置编码矩阵\n",
    "    plt.xlabel('Depth')\n",
    "    plt.ylabel('Position')\n",
    "    plt.colorbar() # 颜色条，-1到1的颜色范围\n",
    "    plt.show()\n",
    "\n",
    "position_embedding = TransformerEmbedding.get_positional_encoding(64, 128)\n",
    "plot_position_embedding(position_embedding)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.960602Z",
     "start_time": "2025-02-06T01:49:50.957655Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:20.169171Z",
     "iopub.status.busy": "2025-02-07T04:56:20.168734Z",
     "iopub.status.idle": "2025-02-07T04:56:20.172749Z",
     "shell.execute_reply": "2025-02-07T04:56:20.172261Z",
     "shell.execute_reply.started": "2025-02-07T04:56:20.169150Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.009999999999999995\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "#为了理解指数对数变换\n",
    "def positional_encoding_weights(emb_size):\n",
    "    # 计算底数和指数\n",
    "    base = math.log(10000)\n",
    "    exponent = -5 / emb_size\n",
    "    \n",
    "    # 应用指数函数\n",
    "    weight = math.exp(exponent*base) \n",
    "    \n",
    "    return weight\n",
    "\n",
    "emb_size = 10  # 举例，可以替换成你需要的大小\n",
    "weight = positional_encoding_weights(emb_size)\n",
    "print(weight)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.966300Z",
     "start_time": "2025-02-06T01:49:50.961609Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:20.173445Z",
     "iopub.status.busy": "2025-02-07T04:56:20.173270Z",
     "iopub.status.idle": "2025-02-07T04:56:20.176810Z",
     "shell.execute_reply": "2025-02-07T04:56:20.176365Z",
     "shell.execute_reply.started": "2025-02-07T04:56:20.173427Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.01"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1/10000**(1/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:50.974674Z",
     "start_time": "2025-02-06T01:49:50.967307Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:20.177751Z",
     "iopub.status.busy": "2025-02-07T04:56:20.177376Z",
     "iopub.status.idle": "2025-02-07T04:56:20.184161Z",
     "shell.execute_reply": "2025-02-07T04:56:20.183719Z",
     "shell.execute_reply.started": "2025-02-07T04:56:20.177732Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
      "         36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
      "         36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "torch.Size([2, 50, 128])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#随机input，调用TransformerEmbedding\n",
    "config={\n",
    "    \"vocab_size\": 100,\n",
    "    \"d_model\": 128,\n",
    "    \"pad_idx\": 0,\n",
    "    \"max_length\": 64,\n",
    "    \"dropout\": 0.1,\n",
    "}\n",
    "input_ids = torch.randint(0, 100, (2, 50))\n",
    "embeds = TransformerEmbedding(config)(input_ids)\n",
    "embeds.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wXavO0SNN4yD"
   },
   "source": [
    "### Transformer Block"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HZL4mu3pN4yD"
   },
   "source": [
    "#### scaled-dot-product-attention"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:51.072130Z",
     "start_time": "2025-02-06T01:49:50.974674Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 970
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:43.651441Z",
     "iopub.status.busy": "2025-02-07T05:28:43.651081Z",
     "iopub.status.idle": "2025-02-07T05:28:43.664763Z",
     "shell.execute_reply": "2025-02-07T05:28:43.664218Z",
     "shell.execute_reply.started": "2025-02-07T05:28:43.651418Z"
    },
    "id": "U9QwdVQYN4yD",
    "outputId": "b6ae9ac8-c71c-4a7b-fd4b-9c15e92dba2c",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "key_value.shape torch.Size([2, 4, 2])\n",
      "torch.Size([2, 3, 2])\n",
      "torch.Size([2, 2, 3, 4])\n"
     ]
    }
   ],
   "source": [
    "from dataclasses import dataclass\n",
    "from typing import Optional, Tuple\n",
    "\n",
    "Tensor = torch.Tensor\n",
    "\n",
    "@dataclass\n",
    "class AttentionOutput:\n",
    "    hidden_states: Tensor\n",
    "    attn_scores: Tensor\n",
    "\n",
    "class MultiHeadAttention(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"] # 隐藏层大小\n",
    "        self.num_heads = config[\"num_heads\"] # 多头注意力的头数\n",
    "        assert (\n",
    "            self.hidden_size % self.num_heads == 0\n",
    "        ), \"Hidden size must be divisible by num_heads but got {} and {}\".format(\n",
    "            self.hidden_size, self.num_heads\n",
    "        )\n",
    "        self.head_dim = self.hidden_size // self.num_heads # 每个头的维度\n",
    "\n",
    "        # layers\n",
    "        self.Wq = nn.Linear(self.hidden_size, self.hidden_size, bias=False) #第二个self.hidden_size可以*系数\n",
    "        self.Wk = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wv = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wo = nn.Linear(self.hidden_size, self.hidden_size, bias=False) # 输出层\n",
    "\n",
    "    def _split_heads(self, x: Tensor) -> Tensor:\n",
    "        bs, seq_len, _ = x.shape #假设输入的维度是[batch_size, seq_len, hidden_size],hidden_size是512\n",
    "        x = x.view(bs, seq_len, self.num_heads, self.head_dim) #num_heads是8，head_dim是64\n",
    "        return x.permute(0, 2, 1, 3) #变换维度，[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "    def _merge_heads(self, x: Tensor) -> Tensor:#将多头注意力的输出合并为一个张量\n",
    "        bs, _, seq_len, _ = x.shape #假设输入的维度是[batch_size, num_heads, seq_len, head_dim]\n",
    "        return x.permute(0, 2, 1, 3).reshape(bs, seq_len, self.hidden_size) # 变换维度，变为[batch_size, seq_len, hidden_size]\n",
    "\n",
    "    def forward(self, querys, keys, values, attn_mask=None) -> AttentionOutput:\n",
    "        # split heads\n",
    "        querys = self._split_heads(self.Wq(querys)) #(batch_size, seq_len,hidden_dim)-->[batch_size, num_heads, seq_len, head_dim]\n",
    "        keys = self._split_heads(self.Wk(keys))#[batch_size, num_heads, seq_len, head_dim]\n",
    "        values = self._split_heads(self.Wv(values))#[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "        # calculate attention scores\n",
    "        qk_logits = torch.matmul(querys, keys.mT) # 计算注意力分数，matmul是矩阵乘法，mT是矩阵转置,qk_logits是[batch_size, num_heads, seq_len, seq_len]\n",
    "        # print(querys.shape[-2], keys.shape[-2])  #3 4\n",
    "        if attn_mask is not None:\n",
    "            attn_mask = attn_mask[:, :, : querys.shape[-2], : keys.shape[-2]]\n",
    "            qk_logits += attn_mask * -1e9 # 给需要mask的地方设置一个负无穷\n",
    "        attn_scores = F.softmax(qk_logits / (self.head_dim**0.5), dim=-1) # 计算注意力分数\n",
    "\n",
    "        # embeds的尺寸是[batch_size, num_heads, seq_len, head_dim]\n",
    "        embeds = torch.matmul(attn_scores, values) # softmax后的结果与value相乘，得到新的表示\n",
    "        embeds = self.Wo(self._merge_heads(embeds)) # 输出层 [batch_size, seq_len, hidden_size]\n",
    "\n",
    "        return AttentionOutput(hidden_states=embeds, attn_scores=attn_scores)\n",
    "\n",
    "mha = MultiHeadAttention({\"num_heads\": 2, \"d_model\": 2})\n",
    "query = torch.randn(2, 3, 2) # [batch_size, seq_len, hidden_size]\n",
    "query /= query.norm(dim=-1, keepdim=True) # 归一化\n",
    "key_value = torch.randn(2, 4, 2)\n",
    "print(f'key_value.shape {key_value.shape}')\n",
    "outputs = mha(query, key_value, key_value) #最终输出shape和query的shape一样\n",
    "print(outputs.hidden_states.shape)\n",
    "print(outputs.attn_scores.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:51.077559Z",
     "start_time": "2025-02-06T01:49:51.072130Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:47.562360Z",
     "iopub.status.busy": "2025-02-07T05:28:47.561995Z",
     "iopub.status.idle": "2025-02-07T05:28:47.567187Z",
     "shell.execute_reply": "2025-02-07T05:28:47.566615Z",
     "shell.execute_reply.started": "2025-02-07T05:28:47.562333Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0.1930, 0.2740, 0.5330],\n",
      "        [0.2001, 0.7764, 0.0236]])\n"
     ]
    }
   ],
   "source": [
    "#随机一个2阶张量，在-1维度计算softmax\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "x = torch.randn(2, 3)\n",
    "x_softmax = F.softmax(x, dim=-1)\n",
    "print(x_softmax)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:51.232825Z",
     "start_time": "2025-02-06T01:49:51.078579Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:48.662199Z",
     "iopub.status.busy": "2025-02-07T05:28:48.661842Z",
     "iopub.status.idle": "2025-02-07T05:28:48.895083Z",
     "shell.execute_reply": "2025-02-07T05:28:48.894500Z",
     "shell.execute_reply.started": "2025-02-07T05:28:48.662174Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhUAAAG6CAYAAAC/RrTYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAo3FJREFUeJzs3Xd4VNXWwOHfTCa9NwKB0HuH0HuTIkWKAnrRACKgoCJW0HsB71VUFLCgYgEURBAQC1IUpBfpPYWSQEivk55MOd8fgYEhEwgwk4F8632eeSQ7e86sNWefnTXn7DOqFEVREEIIIYS4R2p7ByCEEEKIikGKCiGEEEJYhRQVQgghhLAKKSqEEEIIYRVSVAghhBDCKqSoEEIIIYRVSFEhhBBCCKuQokIIIYQQViFFhRBCCCGsQooKYVNjx46lZs2aZeo7e/ZsVCrVbfv16NGDpk2b3mNk1lWzZk3Gjh1r7zDKzZ3s1/tBWcfWjX1TU1NtHFXFIu+bACkqRDnLy8tj9uzZ7Nixw96h3NfeffddfvnllxLt+/btY/bs2WRmZto8hvj4eGbPns3x48dt/lr2UNp7bE9nz55l9uzZxMTE2DsUIe6KFBWiXOXl5TFnzhyLRcVbb71Ffn5++Qd1H7pVUTFnzpxyKyrmzJljsaj4+uuviYyMtHkM1mJpbN2vRcWcOXOkqBAPLI29AxDiGo1Gg0YjQ/JB4OjoaO8Q7oiMLSHKh5yp+H/o2rXPqKgoxowZg7e3N4GBgfz73/9GURRiY2N55JFH8PLyonLlynz00Udmz1+2bBkqlarEp6kdO3agUqlKvbQRExNDYGAgAHPmzEGlUqFSqZg9e7ZZXGV19uxZevbsiZubG1WrVuWDDz4o0aewsJBZs2ZRt25dnJ2dCQkJ4bXXXqOwsNCs39KlS+nVqxeVKlXC2dmZxo0b88UXX5TYnqIo/O9//6NatWq4ubnRs2dPzpw5U+aYP/zwQzp16oS/vz+urq6Ehoaydu1asz4qlYrc3Fy+++4703s0duxYZs+ezauvvgpArVq1TL+7cT+sWLGC0NBQXF1d8fPzY/To0cTGxppt/9qalFu9fzt27KBt27YAjBs3zvRay5YtAyyvqcjNzeXll18mJCQEZ2dnGjRowIcffsjN/yNklUrF1KlT+eWXX2jatCnOzs40adKEzZs33/K9UxSFgIAApk+fbmozGo34+Pjg4OBgdvbm/fffR6PRkJOTA5QcW6W9xzfKzMxk7Nix+Pj44O3tzbhx48jLyzPro9fr+e9//0udOnVwdnamZs2azJw5s8T4unGc3+jGtTjLli3jscceA6Bnz56muG51qXDs2LF4eHhw+fJlBg0ahIeHB1WrVmXRokUAnDp1il69euHu7k6NGjVYuXKl2fPT09N55ZVXaNasGR4eHnh5eTFgwABOnDhR4rU+/fRTmjRpgpubG76+vrRp06bE9m526dIl6tatS9OmTUlKSrplX1ExSFHx/9ioUaMwGo289957tG/fnv/9738sXLiQhx56iKpVq/L+++9Tt25dXnnlFXbt2nXPrxcYGGj6Qz1s2DCWL1/O8uXLGT58+B1vKyMjg/79+9OiRQs++ugjGjZsyOuvv86mTZtMfYxGI0OGDOHDDz9k8ODBfPrppwwdOpQFCxYwatQos+198cUX1KhRg5kzZ/LRRx8REhLCc889Z5qcr/nPf/7Dv//9b1q0aMG8efOoXbs2ffv2JTc3t0xxf/zxx7Rq1Yq3336bd999F41Gw2OPPcYff/xh6rN8+XKcnZ3p2rWr6T2aNGkSw4cP5/HHHwdgwYIFpt9dK9TeeecdnnrqKerVq8f8+fOZNm0a27Zto1u3biUul9zu/WvUqBFvv/02ABMnTjS9Vrdu3SzmpSgKQ4YMYcGCBfTv35/58+fToEEDXn31VbMi4Jo9e/bw3HPPMXr0aD744AMKCgoYMWIEaWlppb53KpWKzp07m43FkydPotVqAdi7d6+pfffu3bRq1QoPDw+L2yrtPb7RyJEjyc7OZu7cuYwcOZJly5YxZ84csz4TJkzgP//5D61bt2bBggV0796duXPnMnr06FLzKE23bt144YUXAJg5c6YprkaNGt3yeQaDgQEDBhASEsIHH3xAzZo1mTp1KsuWLaN///60adOG999/H09PT5566imio6NNz7148SK//PILgwYNYv78+bz66qucOnWK7t27Ex8fb+r39ddf88ILL9C4cWMWLlzInDlzaNmyJf/880+pcV24cIFu3brh6enJjh07CAoKuuP3RDyAFPH/zqxZsxRAmThxoqlNr9cr1apVU1QqlfLee++Z2jMyMhRXV1clLCzM1LZ06VIFUKKjo822u337dgVQtm/fbmoLCwtTatSoYfo5JSVF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",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plt.subplots() 用于创建子图网格，其维度基于 outputs.attn_scores.shape[:2]。子图的行数和列数似乎由 outputs.attn_scores 的前两个维度确定。\n",
    "fig, axis = plt.subplots(*outputs.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs.attn_scores.shape[1]):\n",
    "        # axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())：此行使用 Matplotlib 的 matshow 绘制每个 i 和 j 的注意力分数热图。detach().numpy() 将 PyTorch 张量转换为 NumPy 数组以进行可视化。\n",
    "        axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs.attn_scores.shape[2]):\n",
    "            for y in range(outputs.attn_scores.shape[3]):\n",
    "                # axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")：此代码在热图上叠加文本，显示 (x, y) 位置处的注意力分数。格式化部分 f\"{outputs.attn_scores[i, j, x, y]:.2f}\" 确保以两位小数显示注意力分数。文本以白色居中显示在 (y, x) 坐标处。\n",
    "                axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention without mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:51.374525Z",
     "start_time": "2025-02-06T01:49:51.232825Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:20.455816Z",
     "iopub.status.busy": "2025-02-07T04:56:20.455254Z",
     "iopub.status.idle": "2025-02-07T04:56:20.701407Z",
     "shell.execute_reply": "2025-02-07T04:56:20.700740Z",
     "shell.execute_reply.started": "2025-02-07T04:56:20.455791Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('-'*50)\n",
    "# mask\n",
    "mask = torch.Tensor([[0, 0, 1, 1], [0, 0, 0, 1], [0, 0, 0, 0]]).reshape(1, 1, 3, 4) #手工构造mask\n",
    "outputs_masked = mha(query, key_value, key_value, mask)\n",
    "\n",
    "fig, axis = plt.subplots(*outputs_masked.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs_masked.attn_scores.shape[1]):\n",
    "        axis[i, j].matshow(outputs_masked.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs_masked.attn_scores.shape[2]):\n",
    "            for y in range(outputs_masked.attn_scores.shape[3]):\n",
    "                axis[i, j].text(y, x, f\"{outputs_masked.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention with mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GkzzrRWVN4yE"
   },
   "source": [
    "#### Transformer-Block"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:49:51.380023Z",
     "start_time": "2025-02-06T01:49:51.374525Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:53.446950Z",
     "iopub.status.busy": "2025-02-07T05:28:53.446508Z",
     "iopub.status.idle": "2025-02-07T05:28:53.456910Z",
     "shell.execute_reply": "2025-02-07T05:28:53.456369Z",
     "shell.execute_reply.started": "2025-02-07T05:28:53.446924Z"
    },
    "id": "b16xpL47N4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 通过使用 @dataclass 装饰器，Python 会自动为该类生成一些方法，如 __init__()、__repr__() 和 __eq__() 等，这些方法可以使类的使用更加方便。\n",
    "@dataclass\n",
    "class TransformerBlockOutput:\n",
    "# hidden_states: Tensor：用于存储某个块产生的隐藏状态。\n",
    "# self_attn_scores: Tensor：包含了自注意力机制（self-attention）所计算得到的注意力分数。\n",
    "# cross_attn_scores: Optional[Tensor] = None：是一个可选字段，存储了交叉注意力（cross-attention）计算得到的注意力分数。这里的 Optional 表示这个字段可以是 Tensor 类型，也可以是 None。\n",
    "    hidden_states: Tensor\n",
    "    self_attn_scores: Tensor\n",
    "    cross_attn_scores: Optional[Tensor] = None\n",
    "\n",
    "class TransformerBlock(nn.Module):\n",
    "    def __init__(self, config, add_cross_attention=False):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_heads = config[\"num_heads\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        ffn_dim = config[\"dim_feedforward\"]\n",
    "        eps = config[\"layer_norm_eps\"] # 层归一化的epsilon值\n",
    "\n",
    "        # self-attention\n",
    "        self.self_atten = MultiHeadAttention(config) # 多头注意力\n",
    "        self.self_ln = nn.LayerNorm(self.hidden_size, eps=eps) #层归一化(层标准化)\n",
    "        self.self_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "        # cross-attention，交叉注意力，decoder中使用,因此额外做一个判断\n",
    "        if add_cross_attention:\n",
    "            self.cross_atten = MultiHeadAttention(config)\n",
    "            self.cross_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "            self.cross_dropout = nn.Dropout(dropout_rate)\n",
    "        else:\n",
    "            self.cross_atten = None\n",
    "\n",
    "        # FFN,前馈神经网络\n",
    "        self.ffn = nn.Sequential(\n",
    "            nn.Linear(self.hidden_size, ffn_dim),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(ffn_dim, self.hidden_size),\n",
    "        )\n",
    "        self.ffn_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "        self.ffn_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        hidden_states,\n",
    "        attn_mask=None,\n",
    "        encoder_outputs=None,\n",
    "        cross_attn_mask=None,\n",
    "    ):\n",
    "        # self-attention,自注意力\n",
    "        self_atten_output = self.self_atten(\n",
    "            hidden_states, hidden_states, hidden_states, attn_mask\n",
    "        )\n",
    "        self_embeds = self.self_ln(\n",
    "            hidden_states + self.self_dropout(self_atten_output.hidden_states)\n",
    "        ) #多头注意力进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        # cross-attention，交叉注意力\n",
    "        if self.cross_atten is not None:\n",
    "            assert encoder_outputs is not None\n",
    "            cross_atten_output = self.cross_atten(\n",
    "                self_embeds, encoder_outputs, encoder_outputs, cross_attn_mask\n",
    "            ) #query是self_embeds，key和value都是encoder_outputs\n",
    "            cross_embeds = self.cross_ln(\n",
    "                self_embeds + self.cross_dropout(cross_atten_output.hidden_states)\n",
    "            ) # 交叉注意力进行dropout，然后和self_embeds进行残差连接，然后进行层归一化\n",
    "\n",
    "        # FFN\n",
    "        embeds = cross_embeds if self.cross_atten is not None else self_embeds # 如果有交叉注意力，则使用交叉注意力的输出作为FFN的输入；否则，使用self_embeds作为FFN的输入\n",
    "        ffn_output = self.ffn(embeds) # 前馈神经网络\n",
    "        embeds = self.ffn_ln(embeds + self.ffn_dropout(ffn_output)) # 前馈神经网络进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        return TransformerBlockOutput(\n",
    "            hidden_states=embeds,\n",
    "            self_attn_scores=self_atten_output.attn_scores,\n",
    "            cross_attn_scores=cross_atten_output.attn_scores\n",
    "            if self.cross_atten is not None\n",
    "            else None,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tfJIGaohN4yE"
   },
   "source": [
    "#### Encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:52:15.309596Z",
     "start_time": "2025-02-06T01:52:15.305092Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:56.313473Z",
     "iopub.status.busy": "2025-02-07T05:28:56.313108Z",
     "iopub.status.idle": "2025-02-07T05:28:56.319675Z",
     "shell.execute_reply": "2025-02-07T05:28:56.319034Z",
     "shell.execute_reply.started": "2025-02-07T05:28:56.313449Z"
    },
    "id": "sTLabHm7N4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from typing import List\n",
    "\n",
    "@dataclass\n",
    "class TransformerEncoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    attn_scores: List[Tensor]\n",
    "\n",
    "# https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module\n",
    "class TransformerEncoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_encoder_layers\"]\n",
    "\n",
    "        # layers,仅仅是一个模块的列表，它本身没有定义前向传递（forward pass）过程。你需要在 forward 方法中明确地定义如何使用这些模块。\n",
    "        self.layers = nn.ModuleList(\n",
    "            [TransformerBlock(config) for _ in range(self.num_layers)]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs_embeds, attn_mask=None\n",
    "    ) -> TransformerEncoderOutput:\n",
    "        attn_scores = [] # 存储每个层的注意力分数\n",
    "        embeds = encoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(embeds, attn_mask=attn_mask)\n",
    "            embeds = block_outputs.hidden_states #上一层的输出作为下一层的输入\n",
    "            # 在每个层的输出中，提取了隐藏状态 block_outputs.hidden_states，并将对应的注意力分数 block_outputs.self_attn_scores 添加到列表 attn_scores 中。\n",
    "            attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的注意力分数,用于画图\n",
    "\n",
    "        return TransformerEncoderOutput(\n",
    "            last_hidden_states=embeds, attn_scores=attn_scores\n",
    "        )\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BEMNj6eBN4yE"
   },
   "source": [
    "#### Decoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T01:57:14.347152Z",
     "start_time": "2025-02-06T01:57:14.343465Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:28:58.672930Z",
     "iopub.status.busy": "2025-02-07T05:28:58.672565Z",
     "iopub.status.idle": "2025-02-07T05:28:58.679359Z",
     "shell.execute_reply": "2025-02-07T05:28:58.678878Z",
     "shell.execute_reply.started": "2025-02-07T05:28:58.672905Z"
    },
    "id": "wCHOur-QN4yE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerDecoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    self_attn_scores: List[Tensor]\n",
    "    cross_attn_scores: List[Tensor]\n",
    "\n",
    "\n",
    "class TransformerDecoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_decoder_layers\"]\n",
    "\n",
    "        # layers\n",
    "        self.layers = nn.ModuleList(\n",
    "            [\n",
    "                TransformerBlock(config, add_cross_attention=True)\n",
    "                for _ in range(self.num_layers)\n",
    "            ]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        decoder_inputs_embeds,\n",
    "        encoder_outputs,\n",
    "        attn_mask=None,\n",
    "        cross_attn_mask=None,\n",
    "    ) -> TransformerDecoderOutput:\n",
    "        self_attn_scores = [] # 存储每个层的自注意力分数\n",
    "        cross_attn_scores = [] # 存储每个层的交叉注意力分数\n",
    "        embeds = decoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(\n",
    "                embeds,\n",
    "                attn_mask=attn_mask, # 自注意力的mask\n",
    "                encoder_outputs=encoder_outputs,\n",
    "                cross_attn_mask=cross_attn_mask, # 交叉注意力的mask\n",
    "            )\n",
    "            embeds = block_outputs.hidden_states # 上一层的输出作为下一层的输入\n",
    "            self_attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的自注意力分数,为了画图\n",
    "            cross_attn_scores.append(block_outputs.cross_attn_scores) # 存储每个层的交叉注意力分数，为了画图\n",
    "\n",
    "        return TransformerDecoderOutput(\n",
    "            last_hidden_states=embeds,\n",
    "            self_attn_scores=self_attn_scores,\n",
    "            cross_attn_scores=cross_attn_scores,\n",
    "        )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zPrvXAXtN4yF"
   },
   "source": [
    "#### mask\n",
    "\n",
    "- mask实际上大类上只有两种\n",
    "    1. `padding_mask`：mask掉`pad_idx`，不计算损失\n",
    "    2. `attention_mask`：mask掉`pad_idx`，不计算注意力分数\n",
    "- Decoder的`attention_mask`和Encoder有一定的区别：\n",
    "    - Encoder可以同时看见序列所有信息，故只mask掉`pad_idx`\n",
    "    - Decoder只能看到在自身之前的序列的信息，故要额外mask掉自身之后的序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T02:28:06.090352Z",
     "start_time": "2025-02-06T02:28:06.085850Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:01.449044Z",
     "iopub.status.busy": "2025-02-07T05:29:01.448677Z",
     "iopub.status.idle": "2025-02-07T05:29:01.454150Z",
     "shell.execute_reply": "2025-02-07T05:29:01.453621Z",
     "shell.execute_reply.started": "2025-02-07T05:29:01.449021Z"
    },
    "id": "D2N9VmcAWLn1",
    "outputId": "560b8af9-c854-4fd7-df3e-86e9eb9045cc",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5))==0).transpose(-1, -2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T02:23:11.141381Z",
     "start_time": "2025-02-06T02:23:11.067279Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 426
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:02.997383Z",
     "iopub.status.busy": "2025-02-07T05:29:02.997020Z",
     "iopub.status.idle": "2025-02-07T05:29:03.149911Z",
     "shell.execute_reply": "2025-02-07T05:29:03.149244Z",
     "shell.execute_reply.started": "2025-02-07T05:29:02.997358Z"
    },
    "id": "QxpSYOsaN4yF",
    "outputId": "1022d3c3-c72e-4798-b998-c71c6690b94e",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAGZCAYAAAAHLw/qAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARkdJREFUeJzt3XlcVOX+B/DPADIgm7iwKYqiaYKCgZCSW5JoSpoWbgmhLSakRJpSIWYq4sLFciG9ufRT066pmaWmJKlloRKlN9dExQWQq4JiAs48vz+8zHVigIEZmTkzn/frdV45z5zle2CaL892HpkQQoCIiEiCLAwdABERUX0xiRERkWQxiRERkWQxiRERkWQxiRERkWQxiRERkWQxiRERkWQxiRERkWQxiRERkWQxiZHBrF27FjKZDEePHm2wa/bt2xe+vr617nfhwgXIZDKsXbtWVTZr1izIZLJHGB2Zu8rPWFFRkaFDkQxJJ7E7d+4gKSkJAwcORNOmTat86RAZu7KyMkyfPh0eHh6wtbVFcHAw9u7da+iwiCRD0kmsqKgIs2fPxsmTJ+Hn52focMiEtGnTBn/99RfGjRv3SK/z8ssvIzU1FWPHjsWSJUtgaWmJZ599FocOHXqk1yUyFVaGDkAX7u7uuHbtGtzc3HD06FF0797d0CGRiZDJZLCxsXmk18jKysKmTZuwcOFCTJ06FQAQGRkJX19fvPPOO/jpp58e6fWJTIGka2JyuRxubm71Pv7ll1+Gvb09Ll26hCFDhsDe3h4tW7bEsmXLAADHjx/H008/DTs7O7Rp0wYbN26sco5bt24hLi4Onp6ekMvlaN++PVJSUqBUKtX2W7RoEXr27IlmzZrB1tYWAQEB2LJlS5XzyWQyxMbGYvv27fD19YVcLoePjw92796ttt/t27cRFxcHLy8vyOVyuLi44JlnnkF2dnaN91zZ5n7mzBm89NJLcHJyQosWLZCYmAghBPLy8jB06FA4OjrCzc0NixcvVju+vLwcM2fOREBAAJycnGBnZ4devXph//79Va61adMmBAQEwMHBAY6OjujSpQuWLFlSY3w3b95EUFAQWrVqhdOnT2vc59atW7C0tMRHH32kKisqKoKFhQWaNWuGhxdmeOONNzR+Rv744w/069cPjRs3RsuWLbFgwQK19zX1iVVn/fr1CAgIgK2tLZo2bYpRo0YhLy+v1uO2bNkCS0tLvPbaa6oyGxsbTJgwAYcPH671HJX9e7///jv69OmDxo0bo3379qrP1Q8//IDg4GDY2tqiY8eO2LdvX5VzXLlyBePHj4erq6vqs7Z69Wq1fbT9nVf+zBYtWoSVK1fC29sbcrkc3bt3x5EjR9T2zc/PR3R0NFq1agW5XA53d3cMHToUFy5cqPWe+/btW6X85ZdfhpeXV71i0fV74MaNG5g6dSq6dOkCe3t7ODo6YtCgQfjtt9+qxPnxxx/Dx8cHjRs3hrOzMwIDAzV+rzzs4sWLaN++PXx9fVFQUFDjvoZ04MABhIeHw8PDAzKZDNu3b6/1mMzMTDzxxBOq7876dAdJOonpg0KhwKBBg+Dp6YkFCxbAy8sLsbGxWLt2LQYOHIjAwECkpKTAwcEBkZGRyM3NVR179+5d9OnTB+vXr0dkZCQ++ugjhISEICEhAfHx8WrXWbJkCbp164bZs2dj3rx5sLKywosvvohvvvmmSkyHDh3CpEmTMGrUKCxYsAD37t3DiBEj8J///Ee1z8SJE7FixQqMGDECy5cvx9SpU2Fra4uTJ09qdd8jR46EUqnE/PnzERwcjDlz5iAtLQ3PPPMMWrZsiZSUFLRv3x5Tp07FgQMHVMeVlJTgn//8J/r27YuUlBTMmjUL169fR1hYGHJyclT77d27F6NHj4azszNSUlIwf/589O3bFz/++GO1MRUVFeHpp59GQUEBfvjhB3Ts2FHjfk2aNIGvr69aXIcOHYJMJsONGzfwxx9/qMoPHjyIXr16qR1/8+ZNDBw4EH5+fli8eDE6deqE6dOnY9euXVr97B42d+5cREZGokOHDkhNTUVcXBwyMjLQu3dv3Lp1q8Zjf/31Vzz22GNwdHRUKw8KCgIAtZ9ndW7evIkhQ4YgODgYCxYsgFwux6hRo7B582aMGjUKzz77LObPn4/S0lK88MILuH37turYgoICPPnkk9i3bx9iY2OxZMkStG/fHhMmTEBaWppqP21/55U2btyIhQsX4vXXX8ecOXNw4cIFDB8+HBUVFap9RowYgW3btiE6OhrLly/H5MmTcfv2bVy6dKnWe64LbWIBdPseOH/+PLZv344hQ4YgNTUV06ZNw/Hjx9GnTx9cvXpVtd+qVaswefJkdO7cGWlpafjggw/g7++PX375pdr4//zzT/Tu3RsODg7IzMyEq6urXn8++lRaWgo/Pz9V8q9Nbm4uBg8ejH79+iEnJwdxcXF45ZVXsGfPnrpdWJiII0eOCABizZo1Wh8TFRUlAIh58+apym7evClsbW2FTCYTmzZtUpWfOnVKABBJSUmqsg8//FDY2dmJM2fOqJ13xowZwtLSUly6dElVdvfuXbV9ysvLha+vr3j66afVygEIa2trce7cOVXZb7/9JgCIjz/+WFXm5OQkYmJitL7XSklJSQKAeO2111Rl9+/fF61atRIymUzMnz9fVV75s4iKilLbt6ysTO2cN2/eFK6urmL8+PGqsilTpghHR0dx//79amNZs2aNACCOHDkirl27Jnx8fES7du3EhQsXar2PmJgY4erqqnodHx8vevfuLVxcXMSKFSuEEEL85z//ETKZTCxZskS1X58+fQQA8dlnn6nKysrKhJubmxgxYoSqLDc3t8rnqfJnV+nChQvC0tJSzJ07Vy2248ePCysrqyrlf+fj41Pl9y+EEP/+978FAJGenl7j8ZX3snHjRlVZ5efUwsJC/Pzzz6ryPXv2VLmfCRMmCHd3d1FUVKR23lGjRgknJyfVZ1bb33nlz6xZs2bixo0bqvKvvvpKABBff/216lgAYuHChTXeX3X33KdPnyrlUVFRok2bNnWOpfJYXb4H7t27JxQKhVo8ubm5Qi6Xi9mzZ6vKhg4dKnx8fGq8v8rP2PXr18XJkyeFh4eH6N69u9o9SAEAsW3bthr3eeedd6r8PEaOHCnCwsLqdC2zr4kBwCuvvKL6d5MmTdCxY0fY2dkhIiJCVd6xY0c0adIE58+fV5X961//Qq9eveDs7IyioiLVFhoaCoVCoVZTsLW1Vf375s2bKC4uRq9evTQ2/4WGhsLb21v1umvXrnB0dFS7dpMmTfDLL7+o/aVX33u2tLREYGAghBCYMGFClZ/Fw9e1tLSEtbU1AECpVOLGjRu4f/8+AgMD1e6lSZMmKC0t1Wqk3eXLl9GnTx9UVFTgwIEDaNOmTa3H9OrVCwUFBaomx4MHD6J3797o1asXDh48COBB7UwIUaUmZm9vj5deekn12traGkFBQWr3qY2tW7dCqVQiIiJC7ffv5uaGDh06aGxifdhff/0FuVxepbyyL+6vv/6qNQZ7e3uMGjVK9bryc/r4448jODhYVV7578p7FELgyy+/RHh4OIQQavGHhYWhuLhY9fvU9ndeaeTIkXB2dla9rvz5V17b1tYW1tbWyMzMxM2bN2u9R13UFsvD6vs9IJfLYWHx4KtUoVDgP//5D+zt7dGxY8cq/09cvny5SnOmJidOnECfPn3g5eWFffv2qd2DqTh8+DBCQ0PVysLCwnD48OE6nUfSAzv0wcbGBi1atFArc3JyQqtWrarMCXJyclL7n+7s2bP4/fffqxxfqbCwUPXvnTt3Ys6cOcjJyUFZWZmqXNO8o9atW1cpc3Z2Vrv2ggULEBUVBU9PTwQEBODZZ59FZGQk2rVrV8sda76Gk5MTbGxs0Lx58yrlDzdjAsC6deuwePFinDp1Sq1Zpm3btqp/T5o0CV988QUGDRqEli1bYsCAAYiIiMDAgQOrxDJu3DhYWVnh5MmTWvdxVn4ZHTx4EK1atcKvv/6KOXPmoEWLFli0aJHqPUdHxyojVzX9bp2dnfH7779rde1KZ8+ehRACHTp00Ph+o0aNajze1tZW7bNQ6d69e6r3a1Pd59TT07NKGQDVZ+j69eu4desWVq5ciZUrV2o898OfX21+55X+/tmq/AKuvLZcLkdKSgrefvttuLq64sknn8SQIUMQGRmpUx+3JrXFUkmX7wGlUoklS5Zg+fLlyM3NhUKhUL3XrFkz1b+nT5+Offv2ISgoCO3bt8eAAQMwZswYhISEVIk7PDwcrq6u2LNnD+zt7et0z/fu3UN5eXmdjqmOEKLK/cvlco1/fNVVfn5+leZRV1dXlJSU4K+//tLq8w8wicHS0rJO5eKhQQNKpRLPPPMM3nnnHY37PvbYYwAefJk+99xz6N27N5YvXw53d3c0atQIa9as0dipq821IyIi0KtXL2zbtg3fffcdFi5ciJSUFGzduhWDBg3SfLO1XEOb665fvx4vv/wyhg0bhmnTpsHFxQWWlpZITk7Gn3/+qdrPxcUFOTk52LNnD3bt2oVdu3ZhzZo1iIyMxLp169TOP3z4cHz22WdYsmQJkpOTa40dADw8PNC2bVscOHAAXl5eEEKgR48eaNGiBaZMmYKLFy/i4MGD6Nmzp+qv5LrcpzaUSiVkMhl27dql8Zy1ffm4u7vjypUrVcqvXbsG4ME91qa+n9/KgUcvvfQSoqKiNO7btWtXANr/zrW9NgDExcUhPDwc27dvx549e5CYmIjk5GR8//336NatWzV3++CPPk2/p4cTR11jqWk/bY6fN28eEhMTMX78eHz44Ydo2rQpLCwsEBcXpzbA6/HHH8fp06exc+dO7N69G19++SWWL1+OmTNn4oMPPlA7/4gRI7Bu3Tps2LABr7/+usYYNLl37x7atrFHfqHmn0dd2dvb486dO2plSUlJmDVrll7Orw9mn8R04e3tjTt37lSpEv/dl19+CRsbG+zZs0ftL5g1a9bodH13d3dMmjQJkyZNQmFhIZ544gnMnTtXqyRWX1u2bEG7du2wdetWtb/QkpKSquxrbW2N8PBwhIeHQ6lUYtKkSfjkk0+QmJiI9u3bq/Z788030b59e8ycORNOTk6YMWOGVrH06tULBw4cQNu2beHv7w8HBwf4+fnByckJu3fvRnZ2dpUvB33y9vaGEAJt27ZV/cFSF/7+/ti/fz9KSkrUBndUdvT7+/vrK9QqWrRoAQcHBygUilo/v3X5ndeFt7c33n77bbz99ts4e/Ys/P39sXjxYqxfv77aY5ydnTU2BV68eFGnWHSxZcsW9OvXD59++qla+a1bt6q0bNjZ2WHkyJEYOXIkysvLMXz4cMydOxcJCQlqUzoWLlwIKysrTJo0CQ4ODhgzZoxWsZSXlyO/UIHcY23g6KBbb1HJbSXaBlxEXl6e2udTH7UwAHBzc6sy2rKgoACOjo5a18IAjk7USUREBA4fPqxxNM2tW7dw//59AA/+mpPJZGp/LV64cEGrIaiaKBQKFBcXq5W5uLjAw8NDY/OUPlX+ZfrwX6K//PJLlXbsvzdBWlhYqP6y1xRjYmIipk6dioSEBKxYsUKrWHr16oULFy5g8+bNquZFCwsL9OzZE6mpqaioqKjSH6ZPw4cPh6WlJT744IMqf9kLIar8DP7uhRdegEKhUGvOKysrw5o1axAcHFylSVCfLC0tMWLECHz55Zc4ceJElfevX7+uti9Q++9cW3fv3lU1mVby9vaGg4NDrZ9fb29vnDp1Si2+3377rcZRr4+apaVlld//v/71ryq17L9/HqytrdG5c2cIIaqMlpTJZFi5ciVeeOEFREVFYceOHXWKyc5ePxsAODo6qm36SmI9evRARkaGWtnevXvRo0ePOp1H8jWxpUuX4tatW6oBDl9//TUuX74M4MFf+JV9AY/CtGnTsGPHDgwZMgQvv/wyAgICUFpaiuPHj2PLli24cOECmjdvjsGDByM1NRUDBw7EmDFjUFhYiGXLlqF9+/Z17ocBHswRa9WqFV544QX4+fnB3t4e+/btw5EjR6rM69K3IUOGYOvWrXj++ecxePBg5ObmIj09HZ07d1ZrdnjllVdw48YNPP3002jVqhUuXryIjz/+GP7+/nj88cc1nnvhwoUoLi5GTEwMHBwc1AZfaFKZoE6fPo158+apynv37o1du3ap5gU9Kt7e3pgzZw4SEhJw4cIFDBs2DA4ODsjNzcW2bdvw2muvqSYxaxIcHIwXX3wRCQkJKCwsRPv27bFu3TpcuHChyl/1j8L8+fOxf/9+BAcH49VXX0Xnzp1x48YNZGdnY9++fbhx4wYA7X/n2jpz5gz69++PiIgIdO7cGVZWVti2bRsKCgrUBqloMn78eKSmpiIsLAwTJkxAYWEh0tPT4ePjg5KSknr9HHQ1ZMgQzJ49G9HR0ejZsyeOHz+ODRs2VOmfHjBgANzc3BASEgJXV1ecPHkSS5cuxeDBg+Hg4FDlvBYWFli/fj2GDRuGiIgIfPvtt3j66acb6rbq7M6dOzh37pzqdW5uLnJyctC0aVO0bt0aCQkJuHLlCj777DMAD6YJLV26FO+88w7Gjx+P77//Hl988YXGaUc1qtNYRiPUpk0bAUDjlpubW+OxUVFRws7Orkp5nz59NA6FbdOmjRg8eLBa2e3bt0VCQoJo3769sLa2Fs2bNxc9e/YUixYtEuXl5ar9Pv30U9GhQwchl8tFp06dxJo1a6oM2RbiwdBUTUPn27RpoxrqXlZWJqZNmyb8/PyEg4ODsLOzE35+fmL58uU13q8Q6kN46/OzUCqVYt68eaJNmzZCLpeLbt26iZ07d1YZ4rxlyxYxYMAA4eLiIqytrUXr1q3F66+/Lq5du6ba5+Eh9pUUCoUYPXq0sLKyEtu3b6/1flxcXAQAUVBQoCo7dOiQACB69epV6/08fP+ahmjXNMS+0pdffimeeuopYWdnJ+zs7ESnTp1ETEyMOH36dK3x//XXX2Lq1KnCzc1NyOVy0b17d7F79+5aj6vpXjR9ToXQ/NkqKCgQMTExwtPTUzRq1Ei4ubmJ/v37i5UrV6r20fZ3Xvkz0zR0Hg8NSy8qKhIxMTGiU6dOws7OTjg5OYng4GDxxRdfaHXf69evF+3atRPW1tbC399f7Nmzp96xCKH798C9e/fE22+/Ldzd3YWtra0ICQkRhw8frjId4JNPPhG9e/cWzZo1E3K5XHh7e4tp06aJ4uJi1T6a/v+8e/eu6NOnj7C3t1ebNqFJcXGxACDyT7cWd6966bTln24tAKjFV5P9+/dr/B6u/N6KioqqMj1i//79wt/fX1hbW4t27drVaYpUJZkQdezNJiIio1RSUgInJydcPd1KL31iHh0vo7i4uMqEfGPCPjEiIpIsyfeJERGROoUQUOjYyKbr8Q2FSYyIyMQoIaCEbklI1+MbCpsTiYhIslgTIyIyMUoIKMykJsYkRkRkYticSEREJAGsiRERmRhzGp3ImhiAZcuWwcvLCzY2NggODkZWVpbBYklOTkb37t3h4OAAFxcXDBs2TLVmlrGYP38+ZDIZ4uLiDBrHlStX8NJLL6FZs2awtbVFly5dcPToUYPGpFAokJiYiLZt28LW1hbe3t748MMP6/yEfF3Utky8EAIzZ86Eu7s7bG1tERoairNnzxospoqKCkyfPh1dunSBnZ0dPDw8EBkZWe+18vQR099NnDgRMplMbcVrY6bU0yYFZp/ENm/ejPj4eCQlJSE7Oxt+fn4ICwtTW0upIf3www+IiYnBzz//jL1796KiogIDBgxAaWmpQeL5uyNHjuCTTz5RPczXUG7evImQkBA0atQIu3btwh9//IHFixcbfPHAlJQUrFixAkuXLsXJkyeRkpKCBQsW4OOPP26wGGpbJn7BggX46KOPkJ6ejl9++QV2dnYICwur8lDehorp7t27yM7ORmJiIrKzs7F161acPn0azz333COLp7aYHrZt2zb8/PPPWi2NYywU/x3YoesmCXV+UJWJCQoKUnuenEKhEB4eHiI5OdmAUf1PYWGhACB++OEHQ4cibt++LTp06CD27t0r+vTpI6ZMmWKwWKZPny6eeuopg12/OoMHDxbjx49XKxs+fLgYO3asQeLB35aJVyqVws3NTe2Zgrdu3RJyuVx8/vnnBolJk6ysLAFAXLx40aAxXb58WbRs2VKcOHFCtGnTRvzjH/9okHjqq/LZif8+6SIuXXbTafv3SZc6PTvRUMy6JlZeXo5jx46pradkYWGB0NDQei8zoW+VS640bdrUwJEAMTExGDx4cK3rTzWEHTt2IDAwEC+++CJcXFzQrVs3rFq1ytBhoWfPnsjIyMCZM2cAPFgm5NChQ490jbe6yM3NRX5+vtrv0MnJCcHBwUbzmQcefO5lMhmaNGlisBiUSiXGjRuHadOmwcfHx2Bx1IdC6GeTArMe2FFUVASFQqFxiexTp04ZKKr/USqViIuLQ0hICHx9fQ0ay6ZNm5CdnY0jR44YNI5K58+fx4oVKxAfH493330XR44cweTJk2FtbV3tSsUNYcaMGSgpKUGnTp1gaWkJhUKBuXPnYuzYsQaL6WH5+fkAoPEzX/meod27dw/Tp0/H6NGjDfrg2ZSUFFhZWWHy5MkGi6G+9NGnJZU+MbNOYsYuJiYGJ06cwKFDhwwaR15eHqZMmYK9e/eqrT5rSEqlEoGBgap1xLp164YTJ04gPT3doEnsiy++wIYNG7Bx40b4+PggJycHcXFx8PDwMGhcUlFRUYGIiAgIIbReHPVROHbsGJYsWYLs7Gy11azJ+Jh1c2Lz5s1haWmpcYlsNzc3A0X1QGxsLHbu3In9+/ejVatWBo3l2LFjKCwsxBNPPAErKytYWVnhhx9+wEcffQQrKyu1Fasbiru7Ozp37qxW9vjjj+PSpUsNHsvDpk2bhhkzZmDUqFHo0qULxo0bh7feegvJyckGjatS5efaGD/zlQns4sWL2Lt3r0FrYQcPHkRhYSFat26t+sxfvHgRb7/9Nry8vAwWl7aUkEGh46aENJK3WScxa2trBAQEqC2RrVQqkZGRUeclsvVFCIHY2Fhs27YN33//Pdq2bWuQOB7Wv39/HD9+HDk5OaotMDAQY8eORU5Ojmr5+oYUEhJSZerBmTNn0KZNmwaP5WF3796FhYX6/1aWlpZQKo2jcaZt27Zwc3NT+8yXlJTgl19+MdhnHvhfAjt79iz27duHZs2aGSwWABg3bhx+//13tc+8h4cHpk2bhj179hg0Nm0ohX42KTD75sT4+HhERUUhMDAQQUFBSEtLQ2lpKaKjow0ST0xMDDZu3IivvvoKDg4Oqn4KJycn2NraGiQmBweHKn1ydnZ2aNasmcH66t566y307NkT8+bNQ0REBLKysrBy5UqsXLnSIPFUCg8Px9y5c9G6dWv4+Pjg119/RWpqKsaPH99gMdS2THxcXBzmzJmDDh06oG3btkhMTISHhweGDRtmkJjc3d3xwgsvIDs7Gzt37oRCoVB97ps2bQpra+sGj6l169ZVEmmjRo3g5uaGjh07PpJ4qJ4MPTzSGHz88ceidevWwtraWgQFBdW6BPijBA3LewOo17Ldj5Khh9gLIcTXX38tfH19hVwuF506dRIrV640aDxCCFFSUiKmTJkiWrduLWxsbES7du3Ee++9J8rKyhoshtqWiVcqlSIxMVG4uroKuVwu+vfvL06fPm2wmHJzc6v93O/fv98gMWkipSH2v/zbTfz7kodO2y//dpPEEHuZEBJ5tggREdWopKQETk5O+Onf7rB30K236M5tJXr6XENxcbFB+ydrY9Z9YkREJG1m3ydGRGRqlEIGpdBtdKGuxzcUJjEiIhNTOUxe13NIAZsTiYhIslgTIyIyMQpYQKFjHaXhH2FQP0xiREQmRuihT0ywT4yIiAyBfWJmpqysDLNmzUJZWZmhQ1ExxpgA44yLMWmHMWnPWOOiqjjZGf+bIGhMk/qMMSbAOONiTNphTNoz1rhqUxn3rt/bwk7Hyc6lt5UY1DXX6H8GbE4kIjIxSsig1LGhTQlp1G/YnEhERJJl8jUxpVKJq1evwsHBodrF7UpKStT+awyMMSbAOONiTNphTNpr6LiEELh9+zY8PDyqLOVTH+Y0sMPk+8QuX74MT09PQ4dBRFSrvLw8nRbBrewT2/ZbB9g56LbOX+ltBZ73O8s+MUNzcHAAADyFZ2GFRjqfb9uZ4zqfg4joYSV3lGjzxAXV9xVpz+STWGUTohUawUqmexJz1HHEDxFRdarr8qirBwM7dHwAsESaE00+iRERmRulHh47xdGJREREj5gkktiyZcvg5eUFGxsbBAcHIysry9AhEREZLYWw0MsmBUYf5ebNmxEfH4+kpCRkZ2fDz88PYWFhKCwsNHRoRERGSQkLvWxSYPRRpqam4tVXX0V0dDQ6d+6M9PR0NG7cGKtXrzZ0aEREZGBGPbCjvLwcx44dQ0JCgqrMwsICoaGhOHz4sMZjysrK1B7aaWyTKImIHjWFkEGh41Iquh7fUIy6JlZUVASFQgFXV1e1cldXV+Tn52s8Jjk5GU5OTqqNE52JyNxULoqp6yYF0oiyDhISElBcXKza8vLyDB0SEVGDUgoLvWxSYNTNic2bN4elpSUKCgrUygsKCuDm5qbxGLlcDrlc3hDhERGRgRl1qrW2tkZAQAAyMjJUZUqlEhkZGejRo4cBIyMiMl7m1Jxo1DUxAIiPj0dUVBQCAwMRFBSEtLQ0lJaWIjo62tChEREZJSV0H5ih1E8oj5zRJ7GRI0fi+vXrmDlzJvLz8+Hv74/du3dXGexBRETmx+iTGADExsYiNjbW0GEQEUmCPiYrS2WysySSGBERaU8fj43iY6eIiIgeMdbE6ijMw18v59lzNUcv5yEi+juuJ0ZERJLF5kQiIiIJYE2MiMjE6GOyMic7ExGRQSiFDEpdJzvzKfZERESPFmtiREQmRqmH5kROdiYiIoPQx1IqXIqFiIgMQgEZFDrO89L1+IYijVRLRESkAWtiREQmhs2JREQkWQro3hyo0E8oj5w0Ui0REZEGrIkREZkYNicSEZFk8QHAREREdbRs2TJ4eXnBxsYGwcHByMrKqnH/tLQ0dOzYEba2tvD09MRbb72Fe/fu1emaTGJERCZG/Hc9MV02UceBIZs3b0Z8fDySkpKQnZ0NPz8/hIWFobCwUOP+GzduxIwZM5CUlISTJ0/i008/xebNm/Huu+/W6bpMYkREJqayOVHXrS5SU1Px6quvIjo6Gp07d0Z6ejoaN26M1atXa9z/p59+QkhICMaMGQMvLy8MGDAAo0ePrrX29nfsEzMQfa0QDXCVaCJ6dEpKStRey+VyyOVytbLy8nIcO3YMCQkJqjILCwuEhobi8OHDGs/bs2dPrF+/HllZWQgKCsL58+fx7bffYty4cXWKj0mMiMjE6HMpFk9PT7XypKQkzJo1S62sqKgICoUCrq6uauWurq44deqUxvOPGTMGRUVFeOqppyCEwP379zFx4sQ6NycyiRERmRh9LoqZl5cHR0dHVfnfa2H1lZmZiXnz5mH58uUIDg7GuXPnMGXKFHz44YdITEzU+jxMYkREVC1HR0e1JKZJ8+bNYWlpiYKCArXygoICuLm5aTwmMTER48aNwyuvvAIA6NKlC0pLS/Haa6/hvffeg4WFdkmYAzuIiExMZXOirpu2rK2tERAQgIyMjP/FoFQiIyMDPXr00HjM3bt3qyQqS0tLAIAQQutrsyZGRGRilLDQeVHLuh4fHx+PqKgoBAYGIigoCGlpaSgtLUV0dDQAIDIyEi1btkRycjIAIDw8HKmpqejWrZuqOTExMRHh4eGqZKYNo05iycnJ2Lp1K06dOgVbW1v07NkTKSkp6Nixo6FDIyIyWgohg0LHgR11PX7kyJG4fv06Zs6cifz8fPj7+2P37t2qwR6XLl1Sq3m9//77kMlkeP/993HlyhW0aNEC4eHhmDt3bp2uKxN1qbc1sIEDB2LUqFHo3r077t+/j3fffRcnTpzAH3/8ATs7O63OUVJSAicnJ/TFUFjJGj3iiA2DQ+yJpK3kthLOj51HcXFxrf1PNZ7nv993bxwcDrm9bt93ZXcqsKLXVp1jetSMuia2e/dutddr166Fi4sLjh07ht69exsoKiIi46bPIfbGzqiT2N8VFxcDAJo2bVrtPmVlZSgrK1O9/vtEPSIiUyf08BR7wQcA65dSqURcXBxCQkLg6+tb7X7JyclwcnJSbX+fqEdERKZDMkksJiYGJ06cwKZNm2rcLyEhAcXFxaotLy+vgSIkIjIOCsj0skmBJJoTY2NjsXPnThw4cACtWrWqcV9Nz/UiIjInSqF7n5bSaIf8qTPqJCaEwJtvvolt27YhMzMTbdu2NXRIRERkRIw6icXExGDjxo346quv4ODggPz8fACAk5MTbG1tDRwdEZFxUuphYIeuxzcUo45yxYoVKC4uRt++feHu7q7aNm/ebOjQiIiMlq4LYlZuUmDUNTEjnodNRERGwKiTGBER1Z0hHjtlKExiREQmxpz6xJjETECYh79ezsNnMBKR1DCJERGZGCX08OxEDuwgIiJDEHoYXSiYxIiIyBDM6Sn20ui5IyIi0oA1MSIiE8PRiUREJFlsTiQiIpIA1sSIiEyMPp59yCH2RERkEGxOJCIikgDWxIiITIw51cSYxIiITIw5JTE2JxIRkWSxJkZEZGLMqSbGJEZEZGIEdB8iL/QTyiPHJEZEZGLMqSbGPjEiIpIs1sRIRV8rRANcJZrIkMypJsYkRkRkYswpibE5kYiIJIs1MSIiE2NONTEmMSIiEyOEDELHJKTr8Q2FzYlERCRZkkpi8+fPh0wmQ1xcnKFDISIyWpXriem6SYFkmhOPHDmCTz75BF27djV0KERERs2c+sQkURO7c+cOxo4di1WrVsHZ2dnQ4RARkZGQRBKLiYnB4MGDERoaWuu+ZWVlKCkpUduIiMxJ5cAOXTcpMPrmxE2bNiE7OxtHjhzRav/k5GR88MEHjzgqIiLjxeZEI5GXl4cpU6Zgw4YNsLGx0eqYhIQEFBcXq7a8vLxHHCURERmKUdfEjh07hsLCQjzxxBOqMoVCgQMHDmDp0qUoKyuDpaWl2jFyuRxyubyhQyUiMhrmNE/MqJNY//79cfz4cbWy6OhodOrUCdOnT6+SwIiI6EEC0rU5kElMDxwcHODr66tWZmdnh2bNmlUpJyKiBwQAoeOqllJZFNOo+8SIiIhqYtQ1MU0yMzMNHQIRkVFTQgaZjk/c4BM7iIjIIMxpYAebE4mISLJYE6NHIszDX2/n2nM1R2/nIjIHSiGDzEwmOzOJERGZGCH0MDpRIsMT2ZxIRESSxZoYEZGJMaeBHUxiREQmxpySGJsTiYhIslgTIyIyMRydSEREksXRiURERBLAmhgRkYl5UBPTdWCHnoJ5xJjEiIhMjDmNTmQSIyIyMQK6rwcmkYoY+8SIiEi6WBMjIjIxbE4kIiLpMqP2RDYnEhGRXixbtgxeXl6wsbFBcHAwsrKyatz/1q1biImJgbu7O+RyOR577DF8++23dboma2JERKZGD82JqOPxmzdvRnx8PNLT0xEcHIy0tDSEhYXh9OnTcHFxqbJ/eXk5nnnmGbi4uGDLli1o2bIlLl68iCZNmtTpukxiREQmxhBP7EhNTcWrr76K6OhoAEB6ejq++eYbrF69GjNmzKiy/+rVq3Hjxg389NNPaNSoEQDAy8urznGyOZGIiKpVUlKitpWVlVXZp7y8HMeOHUNoaKiqzMLCAqGhoTh8+LDG8+7YsQM9evRATEwMXF1d4evri3nz5kGhUNQpPtbEyOiFefjr5Tx7rubo5TxExk6foxM9PT3VypOSkjBr1iy1sqKiIigUCri6uqqVu7q64tSpUxrPf/78eXz//fcYO3Ysvv32W5w7dw6TJk1CRUUFkpKStI6TSYyIyNQIWZ37tDSeA0BeXh4cHR1VxXK5XLfz/pdSqYSLiwtWrlwJS0tLBAQE4MqVK1i4cCGTGBER6Yejo6NaEtOkefPmsLS0REFBgVp5QUEB3NzcNB7j7u6ORo0awdLSUlX2+OOPIz8/H+Xl5bC2ttYqPvaJERGZmMqBHbpu2rK2tkZAQAAyMjJUZUqlEhkZGejRo4fGY0JCQnDu3DkolUpV2ZkzZ+Du7q51AgOYxIiITI/Q01YH8fHxWLVqFdatW4eTJ0/ijTfeQGlpqWq0YmRkJBISElT7v/HGG7hx4wamTJmCM2fO4JtvvsG8efMQExNTp+safRK7cuUKXnrpJTRr1gy2trbo0qULjh49auiwiIjoISNHjsSiRYswc+ZM+Pv7IycnB7t371YN9rh06RKuXbum2t/T0xN79uzBkSNH0LVrV0yePBlTpkzROBy/JkbdJ3bz5k2EhISgX79+2LVrF1q0aIGzZ8/C2dnZ0KERERktQz07MTY2FrGxsRrfy8zMrFLWo0cP/Pzzz3W+zsOMOomlpKTA09MTa9asUZW1bdvWgBEREUmERJ59qCujbk7csWMHAgMD8eKLL8LFxQXdunXDqlWrDB0WEZFRq6yJ6bpJgVEnsfPnz2PFihXo0KED9uzZgzfeeAOTJ0/GunXrqj2mrKysygxzIiIyTUbdnKhUKhEYGIh58+YBALp164YTJ04gPT0dUVFRGo9JTk7GBx980JBhEhEZFy7FYhzc3d3RuXNntbLHH38cly5dqvaYhIQEFBcXq7a8vLxHHSYRkZGR6WkzfkZdEwsJCcHp06fVys6cOYM2bdpUe4xcLtfbY1GIiMi4GXVN7K233sLPP/+MefPm4dy5c9i4cSNWrlxZ58lwRERmxQCTnQ3FqJNY9+7dsW3bNnz++efw9fXFhx9+iLS0NIwdO9bQoRERGS8zSmJG3ZwIAEOGDMGQIUMMHQYRERmhetXE8vLycPnyZdXrrKwsxMXFYeXKlXoLjIiI6qlyKRZdNwmoVxIbM2YM9u/fDwDIz8/HM888g6ysLLz33nuYPXu2XgMkIqK6aein2BtSvZoTT5w4gaCgIADAF198AV9fX/z444/47rvvMHHiRMycOVOvQRLpg75WiAa4SjSRsahXEquoqFANY9+3bx+ee+45AECnTp3UnlJMREQGwMnONfPx8UF6ejoOHjyIvXv3YuDAgQCAq1evolmzZnoNkIiI6oh9YjVLSUnBJ598gr59+2L06NHw8/MD8OCBvZXNjERERI9avZoT+/bti6KiIpSUlKit7fXaa6+hcePGeguOiIjqTiYebLqeQwrqVRNLSkrC5cuXqyxO6eXlBRcXF70ERkRE9WRGk53rlcS++uoreHt7o3///ti4cSPKysr0HRcREdUX+8RqlpOTgyNHjsDHxwdTpkyBm5sb3njjDRw5ckTf8REREVWr3s9O7NatGz766CNcvXoVn376KS5fvoyQkBB07doVS5YsQXFxsT7jJCIibbE5UXtCCFRUVKC8vBxCCDg7O2Pp0qXw9PTE5s2b9REjERHVBZNY7Y4dO4bY2Fi4u7vjrbfeQrdu3XDy5En88MMPOHv2LObOnYvJkyfrM1YiIiI19UpiXbp0wZNPPonc3Fx8+umnyMvLw/z589G+fXvVPqNHj8b169f1FigREWnJjGpi9ZonFhERgfHjx6Nly5bV7tO8eXMolcp6B0ZERPWkj9GFpjo6saKiAmvXrkVJScmjiIeIiEhrda6JNWrUCPfu3XsUsRARkR7wiR21iImJQUpKCu7fv6/veIiISFfsE6vZkSNHkJGRge+++w5dunSBnZ2d2vtbt27VS3BEREQ1qVcSa9KkCUaMGKHvWIiIiOqkXklszZo1+o6DiIj0RAY99InpJZJHr15JDADu37+PzMxM/PnnnxgzZgwcHBxw9epVODo6wt7eXp8xEhmdMA9/vZ1rz9UcvZ2LyNzUK4ldvHgRAwcOxKVLl1BWVoZnnnkGDg4OSElJQVlZGdLT0/UdJxERaYvzxGo2ZcoUBAYG4ubNm7C1tVWVP//888jIyNBbcEREVA8cnVizgwcP4qeffoK1tbVauZeXF65cuaKXwIiIqJ70kYQkksTqVRNTKpVQKBRVyi9fvgwHBwedgyIiItJGvZLYgAEDkJaWpnotk8lw584dJCUl4dlnn9VXbEREVA+VT+zQdZOCeiWxxYsX48cff0Tnzp1x7949jBkzRtWUmJKSorfgFAoFEhMT0bZtW9ja2sLb2xsffvghhJDIT5eIyBDYJ1azVq1a4bfffsOmTZvw+++/486dO5gwYQLGjh2rNtBDVykpKVixYgXWrVsHHx8fHD16FNHR0XBycuJaZUREVP95YlZWVnjppZf0GUsVP/30E4YOHYrBgwcDeDBw5PPPP0dWVtYjvS4RkaSZ0cCOeiWxzz77rMb3IyMj6xXM3/Xs2RMrV67EmTNn8Nhjj+G3337DoUOHkJqaWu0xZWVlKCsrU73mkjFEZG7M6Sn29UpiU6ZMUXtdUVGBu3fvwtraGo0bN9ZbEpsxYwZKSkrQqVMnWFpaQqFQYO7cuRg7dmy1xyQnJ+ODDz7Qy/WJiMi41Wtgx82bN9W2O3fu4PTp03jqqafw+eef6y24L774Ahs2bMDGjRuRnZ2NdevWYdGiRVi3bl21xyQkJKC4uFi15eXl6S0eIiJJqHxih66bBNS7T+zvOnTogPnz5+Oll17CqVOn9HLOadOmYcaMGRg1ahQAoEuXLrh48SKSk5MRFRWl8Ri5XA65XK6X6xMRSZIZ9YnVqyZWHSsrK1y9elVv57t79y4sLNRDtLS0hFKp1Ns1iIhIuupVE9uxY4faayEErl27hqVLlyIkJEQvgQFAeHg45s6di9atW8PHxwe//vorUlNTMX78eL1dg4jI1HBgRy2GDRum9lomk6FFixZ4+umnsXjxYn3EBQD4+OOPkZiYiEmTJqGwsBAeHh54/fXXMXPmTL1dg4jI5JhRc2K9klhDNec5ODggLS1N7RFXRERUC308NsqUk1h8fLzW+9Y0p4uIiEgX9Upiv/76K7Kzs3H//n107NgRAHDmzBlYWlriiSeeUO0nk0ljiCYRkUlhc2LNwsPD4eDggHXr1sHZ2RnAg7lj0dHR6NWrF95++229BklkysI8/PVynj1Xc/RyHjIBZpTE6v0U++TkZFUCAwBnZ2fMmTNHrwM7iIiIalKvmlhJSQmuX79epfz69eu4ffu2zkEREVH9mdMQ+3rVxJ5//nlER0dj69atuHz5Mi5fvowvv/wSEyZMwPDhw/UdIxERkUb1qomlp6dj6tSpGDNmDCoqKh6cyMoKEyZMwMKFC/UaIBERUXXqlcQaN26M5cuXY+HChfjzzz8BAN7e3rCzs9NrcEREVA9mNLBDpwcA29nZoWvXrvqKhYiI9IB9YkRERBKgt6VYiIjIiEikJqUrJjEiIlNjRn1ibE4kIiLJYk2MiMjEmNPADiYxIiJTY0bNiUxiREQmxpxqYuwTIyIiyWISIyIyNUJPWx0tW7YMXl5esLGxQXBwMLKysrQ6btOmTZDJZBg2bFidr8kkRkRkagyQxDZv3oz4+HgkJSUhOzsbfn5+CAsLQ2FhYY3HXbhwAVOnTkWvXr3qdsH/YhIjIiKdpaam4tVXX0V0dDQ6d+6M9PR0NG7cGKtXr672GIVCgbFjx+KDDz5Au3bt6nVdDuwgMhH6WiEa4CrRUqfPgR0lJSVq5XK5HHK5XK2svLwcx44dQ0JCgqrMwsICoaGhOHz4cLXXmD17NlxcXDBhwgQcPHiwXnGyJkZEZGr02Jzo6ekJJycn1ZacnFzlckVFRVAoFHB1dVUrd3V1RX5+vsYQDx06hE8//RSrVq3S6VZZEyMiomrl5eXB0dFR9frvtbD6uH37NsaNG4dVq1ahefPmOp2LSYyIyNTocbKzo6OjWhLTpHnz5rC0tERBQYFaeUFBAdzc3Krs/+eff+LChQsIDw9XlSmVSgAPFlg+ffo0vL29tQqTzYlERCamsk9M101b1tbWCAgIQEZGhqpMqVQiIyMDPXr0qLJ/p06dcPz4ceTk5Ki25557Dv369UNOTg48PT21vjZrYkREpLP4+HhERUUhMDAQQUFBSEtLQ2lpKaKjowEAkZGRaNmyJZKTk2FjYwNfX1+145s0aQIAVcprY9Ca2IEDBxAeHg4PDw/IZDJs375d7X0hBGbOnAl3d3fY2toiNDQUZ8+eNUywRERSYYB5YiNHjsSiRYswc+ZM+Pv7IycnB7t371YN9rh06RKuXbum+739jUFrYqWlpfDz88P48eMxfPjwKu8vWLAAH330EdatW4e2bdsiMTERYWFh+OOPP2BjY2OAiImIjJ+hnp0YGxuL2NhYje9lZmbWeOzatWvrfkEYOIkNGjQIgwYN0vieEAJpaWl4//33MXToUADAZ599BldXV2zfvh2jRo1qyFCJiMgIGe3AjtzcXOTn5yM0NFRV5uTkhODg4Bonz5WVlaGkpERtIyIyKwZ6dqIhGG0Sq5wgV5fJcwCQnJysNjGvLqNciIhMApOYdCUkJKC4uFi15eXlGTokIqIGJdPTJgVGm8QqJ8hpO3muklwuV03O02aSHhERSZfRJrG2bdvCzc1NbfJcSUkJfvnlF42T54iI6L/MqDnRoKMT79y5g3Pnzqle5+bmIicnB02bNkXr1q0RFxeHOXPmoEOHDqoh9h4eHvVaOI2IyFwYaoi9IRg0iR09ehT9+vVTvY6PjwcAREVFYe3atXjnnXdQWlqK1157Dbdu3cJTTz2F3bt3c44YEREBMHAS69u3L4SoPt3LZDLMnj0bs2fPbsCoiIgkTo8PADZ2fHYiEZEpkkgS0pXRDuwgIiKqDWtiRFRFmIe/Xs6z52qOXs5DdcOBHUREJF1m1CfG5kQiIpIs1sSIiEwMmxOJiEi62JxIRERk/FgTIyIyMWxOJCIi6TKj5kQmMSIiU2NGSYx9YkREJFmsiRERmRj2iRERkXSxOZGIiMj4sSZGRGRiZEJAVsNajdqeQwqYxIiITA2bE4mIiIwfa2JERCaGoxOJiEi6zKg5kUmMiB4Zfa0QDXCVaNKMSYyIyMSwOZGIiKTLjJoTOTqRiIgkizUxIiITw+ZEIiKSLjYnNowDBw4gPDwcHh4ekMlk2L59u+q9iooKTJ8+HV26dIGdnR08PDwQGRmJq1evGi5gIiKJqKyN1XeTCoMmsdLSUvj5+WHZsmVV3rt79y6ys7ORmJiI7OxsbN26FadPn8Zzzz1ngEiJiMgYGbQ5cdCgQRg0aJDG95ycnLB37161sqVLlyIoKAiXLl1C69atGyJEIiLpEeLBpus5JEBSfWLFxcWQyWRo0qRJtfuUlZWhrKxM9bqkpKQBIiMiMh7mNLBDMkPs7927h+nTp2P06NFwdHSsdr/k5GQ4OTmpNk9PzwaMkoiIGpIkklhFRQUiIiIghMCKFStq3DchIQHFxcWqLS8vr4GiJCIyEkJPmwQYfXNiZQK7ePEivv/++xprYQAgl8shl8sbKDoiIuMjUz7YdD2HFBh1EqtMYGfPnsX+/fvRrFkzQ4dERERGxKBJ7M6dOzh37pzqdW5uLnJyctC0aVO4u7vjhRdeQHZ2Nnbu3AmFQoH8/HwAQNOmTWFtbW2osImIjJsZTXY2aBI7evQo+vXrp3odHx8PAIiKisKsWbOwY8cOAIC/v7/acfv370ffvn0bKkwiIkkxp9GJBk1iffv2hahhLkJN7xERERl1nxgREdUDJzsTEZFUsTmRiMjIhHn46+1ce67m6O1cZFhMYkREpoajE4mISKrYnEhERNJlRgM7JPHsRCIiIk1YEyMiMjFsTiQiIukyo4EdbE4kIiLJYk2MiMjEsDmRiIikSykebLqeQwLYnEhERJLFmhgRkakxo4EdTGJERCZGBj30ieklkkePzYlERCRZrIkREZkaPnaKiIikqnKIva5bXS1btgxeXl6wsbFBcHAwsrKyqt131apV6NWrF5ydneHs7IzQ0NAa968OkxgRkakRetrqYPPmzYiPj0dSUhKys7Ph5+eHsLAwFBYWatw/MzMTo0ePxv79+3H48GF4enpiwIABuHLlSp2uyyRGREQ6S01Nxauvvoro6Gh07twZ6enpaNy4MVavXq1x/w0bNmDSpEnw9/dHp06d8M9//hNKpRIZGRl1ui6TGBGRiZEJoZcNAEpKStS2srKyKtcrLy/HsWPHEBoaqiqzsLBAaGgoDh8+rFXMd+/eRUVFBZo2bVqne+XADiIyO2Ee/no5z56rOXo5j94p/7vpeg4Anp6easVJSUmYNWuWWllRUREUCgVcXV3Vyl1dXXHq1CmtLjd9+nR4eHioJUJtMIkREVG18vLy4OjoqHotl8v1fo358+dj06ZNyMzMhI2NTZ2OZRIjIjIxDzcH6nIOAHB0dFRLYpo0b94clpaWKCgoUCsvKCiAm5tbjccuWrQI8+fPx759+9C1a9c6x8k+MSIiU9PAoxOtra0REBCgNiijcpBGjx49qj1uwYIF+PDDD7F7924EBgbW4Qb/hzUxIiLSWXx8PKKiohAYGIigoCCkpaWhtLQU0dHRAIDIyEi0bNkSycnJAICUlBTMnDkTGzduhJeXF/Lz8wEA9vb2sLe31/q6Bq2JHThwAOHh4fDw8IBMJsP27dur3XfixImQyWRIS0trsPiIiCSp8okdum51MHLkSCxatAgzZ86Ev78/cnJysHv3btVgj0uXLuHatWuq/VesWIHy8nK88MILcHd3V22LFi2q03UNWhMrLS2Fn58fxo8fj+HDh1e737Zt2/Dzzz/Dw8OjAaMjIpImQy2KGRsbi9jYWI3vZWZmqr2+cOFC3S+ggUGT2KBBgzBo0KAa97ly5QrefPNN7NmzB4MHD26gyIiISAqMuk9MqVRi3LhxmDZtGnx8fLQ6pqysTG0yXklJyaMKj4jIOPEBwMYhJSUFVlZWmDx5stbHJCcnw8nJSbX9faIeEZGpkyn1s0mB0SaxY8eOYcmSJVi7di1kMu2XZ0tISEBxcbFqy8vLe4RREhGRIRltEjt48CAKCwvRunVrWFlZwcrKChcvXsTbb78NLy+vao+Ty+WqyXnaTNIjIjI5BhidaChG2yc2bty4Ks/QCgsLw7hx41TzDoiISIN6LKWi8RwSYNAkdufOHZw7d071Ojc3Fzk5OWjatClat26NZs2aqe3fqFEjuLm5oWPHjg0dKhGRZOjzsVPGzqBJ7OjRo+jXr5/qdXx8PAAgKioKa9euNVBUREQkFQZNYn379oWoQ7bX1+Q4IiKTZkZD7I22T4yIiOpJQPf1xKSRw4x3dCIREVFtWBMjIqonfa0QfV9UADivl3MBHNhBRERSJqCHPjG9RPLIsTmRiIgkizUxIiJTw9GJREQkWUoA2j9ytvpzSACbE4mISLJYEyMiMjEcnUhERNJlRn1ibE4kIiLJYk2MiMjUmFFNjEmMiMjUMIkREZFkcYg9ERGR8WNNjIjIxHCIPRERSZcZ9YmxOZGIiCSLNTEiIlOjFIBMx5qUUho1MSYxIiJTY0bNiSafxMR/fxH3USGZRd6IyLzcRwWA/31fkfZMPondvn0bAHAI3xo4EiKimt2+fRtOTk56OJMeamIS+avf5JOYh4cH8vLy4ODgAJlM8+y/kpISeHp6Ii8vD46Ojg0coWbGGBNgnHExJu0wJu01dFxCCNy+fRseHh76OiGbE02FhYUFWrVqpdW+jo6ORvU/EmCcMQHGGRdj0g5j0l5DxqWfGpj5MfkkRkRkdpQCOjcHcnQiEREZhFA+2HQ9hwRwsjMAuVyOpKQkyOVyQ4eiYowxAcYZF2PSDmPSnrHGRVXJBMd0EhGZhJKSEjg5OSHU8w1YWeiWgO8ry7AvbwWKi4uNsr+yEpsTiYhMDfvEiIhIssxoiD37xIiISLJYEyMiMjUCeqiJ6SWSR441MTJbffv2RVxcnKHDINK/yuZEXTcJYBIjIiLJYnMiEZGpUSoB6DhZWcnJzkSS8s0338DJyQkbNmxAXl4eIiIi0KRJEzRt2hRDhw7FhQsXAAAHDhxAo0aNkJ+fr3Z8XFwcevXqBQC4ePEiwsPD4ezsDDs7O/j4+ODbb7mSAjUQNicSmZeNGzdi9OjR2LBhAyIiIhAWFgYHBwccPHgQP/74I+zt7TFw4ECUl5ejd+/eaNeuHf7v//5PdXxFRQU2bNiA8ePHAwBiYmJQVlaGAwcO4Pjx40hJSYG9vb2hbo/IZLE5kczesmXL8N577+Hrr79Gnz59sH79eiiVSvzzn/9ULd+zZs0aNGnSBJmZmRgwYAAmTJiANWvWYNq0aQCAr7/+Gvfu3UNERAQA4NKlSxgxYgS6dOkCAGjXrp1hbo7MkxnNE2MSI7O2ZcsWFBYW4scff0T37t0BAL/99hvOnTsHBwcHtX3v3buHP//8EwDw8ssv4/3338fPP/+MJ598EmvXrkVERATs7OwAAJMnT8Ybb7yB7777DqGhoRgxYgS6du3asDdH5suMntjB5kQya926dUOLFi2wevVq1dLwd+7cQUBAAHJyctS2M2fOYMyYMQAAFxcXhIeHY82aNSgoKMCuXbtUTYkA8Morr+D8+fMYN24cjh8/jsDAQHz88ccGuUciU8aaGJk1b29vLF68GH379oWlpSWWLl2KJ554Aps3b4aLi0uNDz595ZVXMHr0aLRq1Qre3t4ICQlRe9/T0xMTJ07ExIkTkZCQgFWrVuHNN9981LdEBCGUEDoupaLr8Q2FNTEye4899hj279+PL7/8EnFxcRg7diyaN2+OoUOH4uDBg8jNzUVmZiYmT56My5cvq44LCwuDo6Mj5syZg+joaLVzxsXFYc+ePcjNzUV2djb279+Pxx9/vKFvjcyVEA+aA3XZ2CdGJB0dO3bE999/r6qRHThwANOnT8fw4cNx+/ZttGzZEv3791ermVlYWODll1/GvHnzEBkZqXY+hUKBmJgYXL58GY6Ojhg4cCD+8Y9/NPRtEZk8ridGpIMJEybg+vXr2LFjh6FDIVKtJ9bfaRysZNY6neu+KEdG8f9xPTEiU1RcXIzjx49j48aNTGBkfJRKQKZjn5ZE+sSYxIjqYejQocjKysLEiRPxzDPPGDocInVCD0PsJdJIxyRGVA+ZmZmGDoGIwCRGRGRyhFIJoWNzolSG2DOJERGZGjNqTuQ8MSIikizWxIiITI1SADLzqIkxiRERmRohoPOimBJJYmxOJCIiyWJNjIjIxAilgNCxOVEqD3NiTYyIyNQIpX62Olq2bBm8vLxgY2OD4OBgZGVl1bj/v/71L3Tq1Ak2Njbo0qULvv322zpfk0mMiIh0tnnzZsTHxyMpKQnZ2dnw8/NDWFgYCgsLNe7/008/YfTo0ZgwYQJ+/fVXDBs2DMOGDcOJEyfqdF0+AJiIyERUPgC4r+x5WMka6XSu+6ICmWKb1g8ADg4ORvfu3bF06VIAgFKphKenJ958803MmDGjyv4jR45EaWkpdu7cqSp78skn4e/vj/T0dK3jZE2MiMjUNHBzYnl5OY4dO4bQ0FBVmYWFBUJDQ3H48GGNxxw+fFhtf+DBGn3V7V8dDuwgIjIx91Gh8wM77qMCwIPa3cPkcjnkcrlaWVFRERQKBVxdXdXKXV1dcerUKY3nz8/P17h/fn5+neJkEiMiMhHW1tZwc3PDofy6D5DQxN7eHp6enmplSUlJmDVrll7Orw9MYkREJsLGxga5ubkoLy/Xy/mEEJDJZGplf6+FAUDz5s1haWmJgoICtfKCggK4ublpPLebm1ud9q8OkxgRkQmxsbGBjY1Ng17T2toaAQEByMjIwLBhwwA8GNiRkZGB2NhYjcf06NEDGRkZiIuLU5Xt3bsXPXr0qNO1mcSIiEhn8fHxiIqKQmBgIIKCgpCWlobS0lJER0cDACIjI9GyZUskJycDAKZMmYI+ffpg8eLFGDx4MDZt2oSjR49i5cqVdboukxgREels5MiRuH79OmbOnIn8/Hz4+/tj9+7dqsEbly5dgoXF/wbE9+zZExs3bsT777+Pd999Fx06dMD27dvh6+tbp+tynhgREUkW54kREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFkMYkREZFk/T/Qcz0oCgnhnwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 480x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def generate_square_subsequent_mask(sz: int) -> Tensor:\n",
    "    \"\"\"\n",
    "    Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "        Unmasked positions are filled with False.\n",
    "    \"\"\"\n",
    "    # torch.ones(sz, sz): 创建一个全为 1 的 sz × sz 的矩阵。\n",
    "    # torch.triu(...): 使用 triu 函数取得矩阵的上三角部分，将主对角线以下部分置零。\n",
    "    mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "    # mask = torch.triu(torch.ones(sz, sz))\n",
    "    return mask\n",
    "\n",
    "\n",
    "plt.matshow(generate_square_subsequent_mask(16)) #画出一个16×16的矩阵热力图，黄色部分为True，是掩码\n",
    "plt.colorbar()\n",
    "plt.xlabel(\"keys\")\n",
    "plt.ylabel(\"querys\")\n",
    "plt.title(\"1 means mask while 0 means unmask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T02:33:58.033532Z",
     "start_time": "2025-02-06T02:33:57.724614Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 960
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:05.643270Z",
     "iopub.status.busy": "2025-02-07T05:29:05.642902Z",
     "iopub.status.idle": "2025-02-07T05:29:06.128804Z",
     "shell.execute_reply": "2025-02-07T05:29:06.128268Z",
     "shell.execute_reply.started": "2025-02-07T05:29:05.643243Z"
    },
    "id": "cPeMjXO1N4yF",
    "outputId": "e6922ce8-ba71-491f-d7a6-709a14a4b7d7",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['[BOS]', '[UNK]', 'quick', 'brown', '[UNK]', 'jumps', 'over', 'the', '[UNK]', 'dog', '.', '[EOS]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAG1CAYAAADz+MUUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASMZJREFUeJzt3X1cVHX+///ncCEiyECGGkpeYWamqUhayoV5gVSu1q5iZoraupm22mptfmxTu5A1s/pWm+Zamkapu2vZthmkiXhV6iaJpa6GEshaXjKocX1+f/Rz1hFUDsLMAI/77XZuwZkz7/frDM68es45c8ZiGIYhAAAAAEClebi6AAAAAACobQhSAAAAAGASQQoAAAAATCJIAQAAAIBJBCkAAAAAMIkgBQAAAAAmEaQAAAAAwCSCFAAAAACYRJACAAAAAJMIUsBlLFu2TBaLRUeOHHFYP3/+fLVt21aenp7q2rWrS2qrD2bPni2LxaITJ064uhQAKOdyPaK6JCQkyN/fv0bGrsiF/dm1a5fT5ryaC32gtqKP1X0EKcCElJQUPfnkk+rdu7eWLl2quXPnVuv427Zt0+zZs3XmzJlyt82dO1cfffRRtc4HAACAqiFIASZ88cUX8vDw0Ntvv63Ro0fr7rvvrtbxt23bpjlz5hCkAAAA3BxBCjDhp59+kq+vrxo0aODqUgAAAOBCBCnUOfn5+Zo6dapat24tHx8fNW3aVAMGDNDXX39t3+arr77SoEGDZLVa1ahRI0VHR2vr1q1XHNdisWjp0qU6d+6cLBaLLBaLli1bVqma9uzZo4SEBLVt21YNGzZU8+bNNW7cOJ08edK+zezZs/XEE09Iktq0aWOf48iRI7JYLDp37pzeffdd+/qEhAT7/SwWiw4dOqSEhAQFBgbKarVq7NixOn/+vKnH7sI5+T/88IPuvfde+fv7q0WLFvrLX/4iScrIyNBdd90lPz8/tWrVSu+//77D/U+dOqXp06erc+fO8vf3V0BAgOLi4vTNN9+Um+v1119Xp06d1KhRIwUFBalHjx7lxrtUVlaWwsLCdOutt+rHH380tW8AUNPefPNNderUST4+PgoJCdGkSZMqPMPgb3/7m8LDw+Xr66vrr79eo0aN0tGjR686fnp6uoKDgxUTE6OzZ89WqqasrCw9+uij6tChg3x9fdWkSRMNGzbssp/tKiws1B/+8AcFBwfLz89P9913n44fP15uu3Xr1ikyMlJ+fn5q3Lix7rnnHn377bcO21Sm912wZcsWRUREqGHDhmrXrp3eeuutSu3fpehjcCYvVxcAVLdHHnlEf//73zV58mTdcsstOnnypLZs2aJ9+/ape/fu+uKLLxQXF6fw8HDNmjVLHh4eWrp0qe666y5t3rxZt99+e4XjrlixQosXL9aOHTu0ZMkSSdKdd95ZqZo+//xzZWZmauzYsWrevLm+/fZbLV68WN9++62+/PJLWSwW3X///frPf/6jDz74QK+88oquv/56SVJwcLBWrFihhx9+WLfffrsmTJggSWrXrp3DHMOHD1ebNm2UmJior7/+WkuWLFHTpk01b948U49faWmp4uLiFBUVpRdffFFJSUmaPHmy/Pz8NHPmTD344IO6//77tWjRIo0ePVp33HGH2rRpI0nKzMzURx99pGHDhqlNmzb68ccf9dZbbyk6OlrfffedQkJCJEl//etf9fvf/16/+c1vNGXKFBUUFGjPnj366quvNHLkyArr+v7773XXXXfpuuuu0+eff25/fADAHcyePVtz5sxR//79NXHiRB04cEALFy7Uzp07tXXrVnl7e0v65aIOY8eOVUREhBITE/Xjjz/q//2//6etW7dq9+7dCgwMrHD8nTt3KjY2Vj169NDatWvl6+tbqbp27typbdu2acSIEWrZsqWOHDmihQsXKiYmRt99950aNWrksP1jjz2moKAgzZo1S0eOHNGrr76qyZMna9WqVfZtVqxYoTFjxig2Nlbz5s3T+fPntXDhQvXp00e7d+9W69atJVWu90m/hJuBAwcqODhYs2fPVklJiWbNmqVmzZqZ/Cv8gj4GpzGAOsZqtRqTJk2q8LaysjKjffv2RmxsrFFWVmZff/78eaNNmzbGgAED7OuWLl1qSDIOHz5sXzdmzBjDz8/PdE3nz58vt+6DDz4wJBlpaWn2dfPnzy835wV+fn7GmDFjyq2fNWuWIckYN26cw/r77rvPaNKkiak6x4wZY0gy5s6da193+vRpw9fX17BYLMbKlSvt6/fv329IMmbNmmVfV1BQYJSWljqMefjwYcPHx8d49tln7euGDBlidOrU6Yq1XNiv48ePG/v27TNCQkKMiIgI49SpU6b2CQBqwsU94qeffjIaNGhgDBw40OE18I033jAkGe+8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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n",
      "['[BOS]', '[UNK]', 'does', 'the', '[UNK]', 'say', '?', '[EOS]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAG1CAYAAAD3DRUpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR7tJREFUeJzt3XtcVHX+x/E3iAKCM1jhhSBTM80yLbz9VGTE5NJlKfNuq6ibm9qGpW766OKtJCPTLlvKumkXNzOl2s1IvOElLW1T0U1dy0sgWpoK3kAu5/fHPphlAvGAODPA6/l4zGOZM2e+n89hhXcfzswZD8MwDAEAAAAArsjT1Q0AAAAAQHXBAAUAAAAAJjFAAQAAAIBJDFAAAAAAYBIDFAAAAACYxAAFAAAAACYxQAEAAACASQxQAAAAAGASAxQAAAAAmMQABZRh8eLF8vDw0OHDhx22JyYmqkWLFqpTp446dOjgkt5qg2nTpsnDw0MnT550dSsAUMrlMqKqxMXFyd/f/5qsXZbi4/n222+dVvNKinOguiLHajYGKMCk1NRU/fnPf1b37t21aNEizZo1q0rX37Jli6ZNm6YzZ86UemzWrFn69NNPq7QeAAAAKo4BCjBp3bp18vT01N/+9jcNGzZM9957b5Wuv2XLFk2fPp0BCgAAwI0xQAEm/fLLL/L19VW9evVc3QoAAABchAEKNcrZs2c1fvx43XzzzfL29lajRo3Up08ffffdd/Z9vvnmG0VHR8tqtap+/foKDw/XV199Ve66Hh4eWrRokc6fPy8PDw95eHho8eLFpnpKT09XXFycWrRoIR8fHzVp0kQjR47Ur7/+at9n2rRpmjRpkiSpefPm9hqHDx+Wh4eHzp8/r3fffde+PS4uzv48Dw8P/fDDD4qLi1NAQICsVqtGjBihCxcuVOh7V/ya+59++kn333+//P39deONN+ovf/mLJGn37t2KiIiQn5+fmjVrpr///e8Ozz916pQmTpyodu3ayd/fXxaLRTExMdq1a1epWm+88YZuv/121a9fXw0bNlTHjh1LrfdbR44c0S233KI77rhDP//8c4WODQCutbfeeku33367vL29FRQUpHHjxpX5ioKPP/5YoaGh8vX11Q033KBHHnlER48eveL6O3fuVGBgoGw2m86dO2eqpyNHjmjs2LFq3bq1fH19df3116t///6Xfe9WXl6ennrqKQUGBsrPz08PPfSQTpw4UWq/lJQUhYWFyc/PTw0aNNB9992nf//73w77mMm+Yps3b1anTp3k4+Ojli1basGCBaaO77fIMTiLl6sbAKrSY489puXLl+vxxx9X27Zt9euvv2rz5s3au3ev7r77bq1bt04xMTEKDQ3V1KlT5enpqUWLFikiIkKbNm1S586dy1z3/fffV1JSkrZt26aFCxdKkrp162aqp9WrV+vgwYMaMWKEmjRpon//+99KSkrSv//9b3399dfy8PBQ37599Z///Ecffvih5s6dqxtuuEGSFBgYqPfff19/+MMf1LlzZ40ePVqS1LJlS4caAwYMUPPmzZWQkKDvvvtOCxcuVKNGjTR79uwKff8KCwsVExOjnj176uWXX9aSJUv0+OOPy8/PT88884yGDh2qvn37av78+Ro2bJj+7//+T82bN5ckHTx4UJ9++qn69++v5s2b6+eff9aCBQsUHh6u77//XkFBQZKkv/71r3riiSfUr18/xcfHKzc3V+np6frmm280ZMiQMvv68ccfFRERoeuuu06rV6+2f38AwB1MmzZN06dP1z333KMxY8Zo//79evvtt7V9+3Z99dVXqlu3rqT/XqxhxIgR6tSpkxISEvTzzz/rtdde01dffaUdO3YoICCgzPW3b9+uqKgodezYUZ999pl8fX1N9bV9+3Zt2bJFgwYNUnBwsA4fPqy3335bNptN33//verXr++w/5/+9Cc1bNhQU6dO1eHDhzVv3jw9/vjj+uijj+z7vP/++xo+fLiioqI0e/ZsXbhwQW+//bZ69OihHTt26Oabb5ZkLvuk/w41kZGRCgwM1LRp01RQUKCpU6eqcePGFfx/4b/IMTiFAdQgVqvVGDduXJmPFRUVGa1atTKioqKMoqIi+/YLFy4YzZs3N/r06WPftmjRIkOScejQIfu24cOHG35+fhXu6cKFC6W2ffjhh4YkY+PGjfZtiYmJpWoW8/PzM4YPH15q+9SpUw1JxsiRIx22P/TQQ8b1119foT6HDx9uSDJmzZpl33b69GnD19fX8PDwMJYuXWrfvm/fPkOSMXXqVPu23Nxco7Cw0GHNQ4cOGd7e3saMGTPs22JjY43bb7+93F6Kj+vEiRPG3r17jaCgIKNTp07GqVOnKnRMAHAtlMyIX375xahXr54RGRnp8DvwzTff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PfXBBx/owQcf1IABA/TFF1+U+ustALhKYGCgpkyZounTpys6Olq/+93vtH//fr311lvq1KmTHnnkEUlS3bp1NXv2bI0YMULh4eEaPHiw/TLmN998s5588sky1/f19dXnn3+uiIgIxcTEaMOGDbrjjjtM9Xb//ffr/fffl9VqVdu2bbV161atWbNG119/faWO1WKx6O2339bvf/973X333Ro0aJACAwP1008/aeXKlerevbvefPPNCmXf9OnT9eWXXyosLExjx45VQUGB/TOW0tPTK9VnZZFjMM01F/8Dql5eXp4xadIko3379kaDBg0MPz8/o3379sZbb73lsN+OHTuMvn37Gtdff73h7e1tNGvWzBgwYICxdu1a+z5VeRnzzMxM46GHHjICAgIMq9Vq9O/f38jKyip1+VTDMIyZM2caN954o+Hp6elQf9++fUbPnj0NX19fQ5L9kuYlL5NaUln9X8nlji88PLzMy7U2a9bMuO++++z3c3NzjQkTJhhNmzY1fH19je7duxtbt241wsPDjfDwcPt+CxYsMHr27Gn//rds2dKYNGmSkZ2dbd+nrOO6cOGCER4ebvj7+xtff/216eMCgKpW1u/YN99802jTpo1Rt25do3HjxsaYMWOM06dPl3ruRx99ZNx1112Gt7e3cd111xlDhw41MjMzHfYp6/fxyZMnjbZt2xpNmjQxDhw4YKrP06dPGyNGjDBuuOEGw9/f34iKijL27dtnNGvWzOGjMYqPZ/v27Q7PX79+vSHJWL9+fantUVFRhtVqNXx8fIyWLVsacXFxxrfffmvfpyLZt2HDBiM0NNSoV6+e0aJFC2P+/Pn2HKgIcgzO4mEYFXyXOQAAAADUUrwHCgAAAABM4j1QQCVlZ2fr4sWL5e5T1mVena269AkAMOfcuXNlXgyppMDAwMteuru6IcfgbngJH1BJcXFxevfdd8vdxx1+vKpLnwAAc6ZNm1bq84Z+69ChQ7r55pud09A1Ro7B3TBAAZX0/fffKysrq9x9nPV5U+WpLn0CAMw5ePCgDh48WO4+PXr0cPg8ouqMHIO7YYACAAAAAJO4iAQAAAAAmMQABQAAAAAmMUDBbs+ePYqLi3NqzcOHDys1NVWS1LFjR6fWrq2++eYbde/eXXfffbc++OADV7cDAJflilySyCZXIJtQnTBAlZCWlqaQkBAlJSXJ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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "#通过下面代码查看mask的效果\n",
    "inputs_words = [\"The quick brown fox jumps over the lazy dog .\", \"What does the fox say ?\"]\n",
    "\n",
    "inputs_ids, input_mask = tokenizer.encode([w.split() for w in inputs_words], return_mask=True)\n",
    "for i in range(len(inputs_words)):\n",
    "    decode_text = tokenizer.decode(inputs_ids[i: i+1].tolist(), remove_bos=False, remove_eos=False, remove_pad=False, split=True)[0]\n",
    "    print(decode_text)\n",
    "    # print(input_mask[i].reshape(1, -1))\n",
    "    self_attn_mask  = input_mask[i].reshape(1, -1).repeat_interleave(inputs_ids.shape[-1], dim=0)\n",
    "    # print(input_mask[i].reshape(1, -1).repeat_interleave(inputs_ids.shape[-1], dim=0))\n",
    "    look_ahead_mask = generate_square_subsequent_mask(inputs_ids.shape[-1])\n",
    "\n",
    "    fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n",
    "    axs[0].matshow(self_attn_mask)\n",
    "    axs[0].set_title(\"self_attn_mask\")\n",
    "    axs[0].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_ylabel(\"querys\")\n",
    "    axs[0].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_xlabel(\"keys\")\n",
    "    axs[1].matshow(look_ahead_mask)\n",
    "    axs[1].set_title(\"look_ahead_mask\")\n",
    "    axs[1].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_ylabel(\"querys\")\n",
    "    axs[1].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_xlabel(\"keys\")\n",
    "    plt.show()\n",
    "    print('-'*50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.179078300Z",
     "start_time": "2024-08-05T08:06:26.513547400Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:21.465192Z",
     "iopub.status.busy": "2025-02-07T04:56:21.464992Z",
     "iopub.status.idle": "2025-02-07T04:56:21.470153Z",
     "shell.execute_reply": "2025-02-07T04:56:21.469653Z",
     "shell.execute_reply.started": "2025-02-07T04:56:21.465171Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5)) == 0).transpose(-1, -2).bool()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.159090100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:21.470975Z",
     "iopub.status.busy": "2025-02-07T04:56:21.470748Z",
     "iopub.status.idle": "2025-02-07T04:56:21.475774Z",
     "shell.execute_reply": "2025-02-07T04:56:21.475304Z",
     "shell.execute_reply.started": "2025-02-07T04:56:21.470954Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([5, 1, 4, 4])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#帮我随机两个[5, 1, 1, 4]与[1, 1, 4, 4]尺寸的张量，并求和\n",
    "a = torch.randn(5, 1, 1, 4)\n",
    "b = torch.randn(1, 1, 4, 4)\n",
    "(a + b).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TelCDOoEN4yF"
   },
   "source": [
    "#### Transformer Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:11:56.433217Z",
     "start_time": "2025-02-06T03:11:56.423245Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:11.465061Z",
     "iopub.status.busy": "2025-02-07T05:29:11.464616Z",
     "iopub.status.idle": "2025-02-07T05:29:11.482041Z",
     "shell.execute_reply": "2025-02-07T05:29:11.481516Z",
     "shell.execute_reply.started": "2025-02-07T05:29:11.465036Z"
    },
    "id": "oFGNt8FPN4yF",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerOutput:\n",
    "    logits: Tensor\n",
    "    encoder_last_hidden_states: Tensor\n",
    "    encoder_attn_scores: List[Tensor] #画图\n",
    "    decoder_last_hidden_states: Tensor\n",
    "    decoder_self_attn_scores: List[Tensor] #画图\n",
    "    decoder_cross_attn_scores: List[Tensor] #画图\n",
    "    preds: Optional[Tensor] = None\n",
    "\n",
    "class TransformerModel(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_encoder_layers = config[\"num_encoder_layers\"]\n",
    "        self.num_decoder_layers = config[\"num_decoder_layers\"]\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        self.bos_idx = config[\"bos_idx\"]\n",
    "        self.eos_idx = config[\"eos_idx\"]\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "        self.share = config[\"share_embedding\"] # 是否共享词嵌入，共享后，decoder的词嵌入层和encoder的词嵌入层相同，节省内存\n",
    "\n",
    "        # layers\n",
    "        self.src_embedding = TransformerEmbedding(config) # 输入的嵌入层\n",
    "        if self.share:#如果共享词嵌入，则使用src_embedding作为trg_embedding\n",
    "            self.trg_embedding = self.src_embedding #源和目标的嵌入层相同，共享参数，节省内存\n",
    "            self.linear = lambda x: torch.matmul(\n",
    "                x, self.trg_embedding.get_word_embedding_weights().T\n",
    "            ) # 输出层，共享参数，直接拿原有embedding矩阵的转置，节省内存\n",
    "        else:\n",
    "            self.trg_embedding = TransformerEmbedding(config) #decoder模块的嵌入层\n",
    "            self.linear = nn.Linear(self.hidden_size, self.vocab_size) # 输出层\n",
    "\n",
    "        self.encoder = TransformerEncoder(config)\n",
    "        self.decoder = TransformerDecoder(config)\n",
    "\n",
    "        # init weights\n",
    "        self._init_weights()\n",
    "\n",
    "    def _init_weights(self):\n",
    "        \"\"\"使用 xavier 均匀分布来初始化权重\"\"\"\n",
    "        for p in self.parameters():\n",
    "            if p.dim() > 1:\n",
    "                nn.init.xavier_uniform_(p)\n",
    "\n",
    "    def generate_square_subsequent_mask(self, sz: int) -> Tensor:\n",
    "        \"\"\"\n",
    "        Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "            Unmasked positions are filled with False.为了生成斜三角的mask\n",
    "        \"\"\"\n",
    "        mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "\n",
    "        return mask\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs, decoder_inputs, encoder_inputs_mask=None\n",
    "    ) -> TransformerOutput:\n",
    "        # encoder_inputs: [batch_size, src_len]\n",
    "        # decoder_inputs: [batch_size, trg_len]\n",
    "        # encoder_inputs_mask: [batch_size, src_len]\n",
    "        if encoder_inputs_mask is None:\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx) # [batch_size, src_len]\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(\n",
    "            2\n",
    "        )  # [batch_size, 1, 1, src_len],用于encoder的自注意力\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(decoder_inputs.shape[1])\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(decoder_inputs.device)\n",
    "        )  #[trg_len, trg_len]--> [1, 1, trg_len, trg_len],用于decoder的自注意力\n",
    "        #增加decoder_inputs_mask和look_ahead_mask进行组合\n",
    "        decoder_inputs_mask = decoder_inputs.eq(self.pad_idx) # [batch_size, trg_len]，和上面encoder_inputs_mask一致\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, trg_len]\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask + look_ahead_mask # [batch_size, 1, 1, trg_len]与[1, 1, trg_len, trg_len]相加，得到decoder的自注意力mask\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds, encoder_inputs_mask) #encoder_inputs_mask用于encoder的自注意力,广播去做计算\n",
    "\n",
    "        # decoding\n",
    "        decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "        decoder_outputs = self.decoder(\n",
    "            decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "            encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "            attn_mask=decoder_inputs_mask, #用于decoder的自注意力,广播去做计算\n",
    "            cross_attn_mask=encoder_inputs_mask,#用于decoder的交叉注意力,广播去做计算\n",
    "        )\n",
    "\n",
    "        logits = self.linear(decoder_outputs.last_hidden_states) # [batch_size, trg_len, vocab_size]\n",
    "\n",
    "        return TransformerOutput(\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )\n",
    "\n",
    "    @torch.no_grad()\n",
    "    def infer(self, encoder_inputs, encoder_inputs_mask=None) -> Tensor:\n",
    "        # assert len(encoder_inputs.shape) == 2 and encoder_inputs.shape[0] == 1\n",
    "        if encoder_inputs_mask is None:#应对多个样本同时进行推理\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx)\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, src_len],[1,src_len]相加时，会自动广播到[batch_size,1,src_len,src_len]\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(self.max_length)\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(encoder_inputs.device)\n",
    "        )  # [1, 1, trg_len, trg_len]\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds) #因为只支持单样本预测，没有paddings，所以不需要mask\n",
    "\n",
    "        # decoding,多样本推理\n",
    "        decoder_inputs = torch.Tensor([self.bos_idx] * encoder_inputs.shape[0]).reshape(-1, 1).long().to(device=encoder_inputs.device)\n",
    "        for cur_len in tqdm(range(1, self.max_length + 1)):\n",
    "            decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "            decoder_outputs = self.decoder(\n",
    "                decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "                encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "                attn_mask=look_ahead_mask[:, :, :cur_len, :cur_len],#decoder的自注意力mask\n",
    "            )\n",
    "\n",
    "            logits = self.linear(decoder_outputs.last_hidden_states)\n",
    "            next_token = logits.argmax(dim=-1)[:, -1:] #通过最大下标确定类别，[:, -1:]表示取最后一个结果\n",
    "            decoder_inputs = torch.cat([decoder_inputs, next_token], dim=-1) #预测输出拼接到输入中\n",
    "            #(decoder_inputs == self.eos_idx).sum(dim=-1)是判断样本中是否含有EOS标记\n",
    "            #all是每一个都为True，才会结束\n",
    "            if all((decoder_inputs == self.eos_idx).sum(dim=-1) > 0):\n",
    "                break\n",
    "\n",
    "        return TransformerOutput(\n",
    "            preds=decoder_inputs[:, 1:],\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kXHQ3sGTN4yG"
   },
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OxNA8DIzN4yG"
   },
   "source": [
    "### 损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:16:20.185187Z",
     "start_time": "2025-02-06T03:16:20.181945Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:15.967496Z",
     "iopub.status.busy": "2025-02-07T05:29:15.967139Z",
     "iopub.status.idle": "2025-02-07T05:29:15.972389Z",
     "shell.execute_reply": "2025-02-07T05:29:15.971748Z",
     "shell.execute_reply.started": "2025-02-07T05:29:15.967472Z"
    },
    "id": "1xzahHANN4yG",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class CrossEntropyWithPadding:\n",
    "    def __init__(self, config):\n",
    "        self.label_smoothing = config[\"label_smoothing\"]\n",
    "\n",
    "    def __call__(self, logits, labels, padding_mask=None):\n",
    "        # logits.shape = [batch size, sequence length, num of classes]\n",
    "        # labels.shape = [batch size, sequence length]\n",
    "        # padding_mask.shape = [batch size, sequence length]\n",
    "        bs, seq_len, nc = logits.shape\n",
    "        loss = F.cross_entropy(logits.reshape(bs * seq_len, nc), labels.reshape(-1), reduce=False, label_smoothing=self.label_smoothing) #label_smoothing表示随机将一个类别的概率设置为0.1，使得模型更加关注其他类别\n",
    "        if padding_mask is None:\n",
    "            loss = loss.mean()\n",
    "        else:\n",
    "            padding_mask = 1 - padding_mask.reshape(-1) #将padding_mask reshape成一维张量，mask部分为0，非mask部分为1\n",
    "            loss = torch.mul(loss, padding_mask).sum() / padding_mask.sum()\n",
    "\n",
    "        return loss\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zuBC9KqFN4yG"
   },
   "source": [
    "### 学习率衰减"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:17.802823Z",
     "iopub.status.busy": "2025-02-07T05:29:17.802223Z",
     "iopub.status.idle": "2025-02-07T05:29:17.921116Z",
     "shell.execute_reply": "2025-02-07T05:29:17.920629Z",
     "shell.execute_reply.started": "2025-02-07T05:29:17.802799Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f5b9eb42a10>]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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YrEwbdo0Xn75ZXr27Em3bt148cUX6dixI6NGjaq/mYqIiEijZXdhiY+P58yZM8yePZucnBwiIiJYv3591UWz2dnZuLn964mbYcOGsXTpUl544QVmzZpFz549Wb16Nf37968a89xzz1FcXMwTTzzBhQsXuOWWW1i/fj0+PrpmREREROrwPizOqiHfh0VEREQaRoO8D4uIiIiII6iwiIiIiNNTYRERERGnp8IiIiIiTk+FRURERJyeCouIiIg4PRUWERERcXoqLCIiIuL0VFhERETE6dn91vzO6rs37C0sLHRwEhEREamt787b13vjfZcpLEVFRQAEBwc7OImIiIjYq6ioCH9//6ve7zKfJWSz2Th16hS+vr5YLJZ6e9zCwkKCg4M5fvy4S35GkavPD1x/jq4+P3D9OWp+jZ+rz7Eh52eMoaioiI4dO1b78OTvc5lnWNzc3OjcuXODPb6fn59L/hB+x9XnB64/R1efH7j+HDW/xs/V59hQ87vWMyvf0UW3IiIi4vRUWERERMTpqbBch7e3N3PmzMHb29vRURqEq88PXH+Orj4/cP05an6Nn6vP0Rnm5zIX3YqIiIjr0jMsIiIi4vRUWERERMTpqbCIiIiI01NhEREREaenwnIdixcvJiQkBB8fH6Kjo9m6daujI13h17/+NRaLpdotNDS06v7S0lImTpxI27ZtadmyJQ8++CC5ubnVHiM7O5uRI0fSvHlz2rdvz/Tp06msrKw2ZuPGjURFReHt7U2PHj14++23G2Q+X3zxBffccw8dO3bEYrGwevXqavcbY5g9ezYdOnSgWbNmxMbGcuDAgWpjzp07x9ixY/Hz86NVq1Y89thjXLx4sdqYHTt2cOutt+Lj40NwcDC///3vr8iycuVKQkND8fHxISwsjHXr1t2QOf7sZz+74pjeeeedjWaOSUlJDB48GF9fX9q3b8+oUaPYt29ftTE38ueyvn+PazO/22+//Ypj+OSTTzaK+QG88cYbDBgwoOqNwmJiYvj444+r7m/Mx68282vsx+/75s6di8ViYdq0aVXbGt0xNHJVy5cvN15eXuavf/2r2bVrl3n88cdNq1atTG5urqOjVTNnzhzTr18/c/r06arbmTNnqu5/8sknTXBwsElJSTHbtm0zQ4cONcOGDau6v7Ky0vTv39/ExsaajIwMs27dOhMQEGBmzpxZNebw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QECAycvLM8Zcfulaly5dzGeffWa2bdtmYmJiTExMTNX+37107Y477jCZmZlm/fr1pl27djW+dG369Olmz549ZvHixQ32suaioiKTkZFhMjIyDGBee+01k5GRYY4dO2aMufyy5latWpkPP/zQ7Nixw9x33301vqw5MjLSfPPNN+bLL780PXv2rPaS3wsXLpjAwEDz6KOPmqysLLN8+XLTvHnzK17y6+HhYebNm2f27Nlj5syZU28va77WHIuKisyzzz5rUlNTzZEjR8ynn35qoqKiTM+ePU1paWmjmONTTz1l/P39zcaNG6u9LLSkpKRqzI36uWyI3+Prze/gwYPmN7/5jdm2bZs5cuSI+fDDD0337t3Nbbfd1ijmZ4wxM2bMMJs2bTJHjhwxO3bsMDNmzDAWi8X885//NMY07uN3vfm5wvGryfdf+dTYjqEKy3UsWrTIdOnSxXh5eZkhQ4aYr7/+2tGRrhAfH286dOhgvLy8TKdOnUx8fLw5ePBg1f2XLl0yv/zlL03r1q1N8+bNzf33329Onz5d7TGOHj1q7rrrLtOsWTMTEBBgnnnmGVNRUVFtzOeff24iIiKMl5eX6d69u3nrrbcaZD6ff/65Aa64jR8/3hhz+aXNL774ogkMDDTe3t5mxIgRZt++fdUe4+zZsyYhIcG0bNnS+Pn5mQkTJpiioqJqY7Zv325uueUW4+3tbTp16mTmzp17RZZ3333X9OrVy3h5eZl+/fqZjz76qMHnWFJSYu644w7Trl074+npabp27Woef/zxK365nXmONc0NqPYzcyN/Luv79/h688vOzja33XabadOmjfH29jY9evQw06dPr/Y+Hs48P2OM+fnPf266du1qvLy8TLt27cyIESOqyooxjfv4XW9+rnD8avL9wtLYjqHFGGPse05GRERE5MbSNSwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp6fCIiIiIk5PhUVEREScngqLiIiIOD0VFhEREXF6KiwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp/d/WvhGRCRCR7sAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x=np.arange(1, 40000)\n",
    "plt.plot(x, x * (4000 ** (-1.5)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:21.636022Z",
     "iopub.status.busy": "2025-02-07T04:56:21.635622Z",
     "iopub.status.idle": "2025-02-07T04:56:21.639485Z",
     "shell.execute_reply": "2025-02-07T04:56:21.638917Z",
     "shell.execute_reply.started": "2025-02-07T04:56:21.636001Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "22.627416997969522"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(512)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:18:28.334579Z",
     "start_time": "2025-02-06T03:18:28.281593Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 449
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:20.250062Z",
     "iopub.status.busy": "2025-02-07T05:29:20.249681Z",
     "iopub.status.idle": "2025-02-07T05:29:20.358312Z",
     "shell.execute_reply": "2025-02-07T05:29:20.357808Z",
     "shell.execute_reply.started": "2025-02-07T05:29:20.250036Z"
    },
    "id": "UQPiKK4nN4yG",
    "outputId": "63cfb132-ef75-4f94-f0c8-86a2f36e09c2",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# NoamDecayScheduler 是一个自定义或外部定义的学习率衰减调度器类。它需要接收配置 config 作为参数，可能实现了特定的学习率衰减方案\n",
    "class NoamDecayScheduler:\n",
    "    def __init__(self, config):\n",
    "        self.d_model = config[\"d_model\"]\n",
    "        self.warmup_steps = config[\"warmup_steps\"]\n",
    "\n",
    "    def __call__(self, step):\n",
    "        step += 1\n",
    "        arg1 = step ** (-0.5) #4000步之后是arg1\n",
    "        arg2 = step * (self.warmup_steps ** (-1.5))  #4000步之前是arg2\n",
    "\n",
    "        arg3 = self.d_model ** (-0.5)\n",
    "\n",
    "        return arg3 * np.minimum(arg1, arg2)\n",
    "\n",
    "\n",
    "temp_learning_rate_schedule = NoamDecayScheduler({\"d_model\": 512, \"warmup_steps\": 4000})\n",
    "#下面是学习率的设计图\n",
    "plt.plot(temp_learning_rate_schedule(np.arange(0, 40000)))\n",
    "plt.ylabel(\"Leraning rate\")\n",
    "plt.xlabel(\"Train step\")\n",
    "plt.grid()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XHj_EjzlN4yW"
   },
   "source": [
    "### 优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:22:41.395632Z",
     "start_time": "2025-02-06T03:22:41.392126Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:22.545319Z",
     "iopub.status.busy": "2025-02-07T05:29:22.544937Z",
     "iopub.status.idle": "2025-02-07T05:29:22.549848Z",
     "shell.execute_reply": "2025-02-07T05:29:22.549154Z",
     "shell.execute_reply.started": "2025-02-07T05:29:22.545292Z"
    },
    "id": "1EVLKx2rN4yW",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from torch.optim.lr_scheduler import LambdaLR\n",
    "from torch.optim import Adam\n",
    "\n",
    "def get_optimizer(model, config):\n",
    "    base_lr = 0.1\n",
    "    beta1 = config[\"beta1\"] # Adam 的 beta1\n",
    "    beta2 = config[\"beta2\"] # Adam 的 beta2\n",
    "    eps = config[\"eps\"]\n",
    "    optimizer = Adam(model.parameters(), lr=base_lr, betas=(beta1, beta2), eps=eps)\n",
    "    lr_scheduler = NoamDecayScheduler(config) #config是一个字典，包含了学习率衰减的参数\n",
    "    # 使用 LambdaLR 调度器，它可以根据给定的函数 lr_lambda 调整学习率。这里将 lr_scheduler 作为函数传递给 LambdaLR，它包含了特定于模型或任务的学习率调度规则\n",
    "    scheduler = LambdaLR(optimizer, lr_lambda=lr_scheduler)\n",
    "    return optimizer, scheduler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JBhiO7O2N4yW"
   },
   "source": [
    "### Callback"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:22:52.323631Z",
     "start_time": "2025-02-06T03:22:46.482716Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:24.097740Z",
     "iopub.status.busy": "2025-02-07T05:29:24.097359Z",
     "iopub.status.idle": "2025-02-07T05:29:24.105386Z",
     "shell.execute_reply": "2025-02-07T05:29:24.104694Z",
     "shell.execute_reply.started": "2025-02-07T05:29:24.097715Z"
    },
    "id": "rWFMJwBkN4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:22:57.534600Z",
     "start_time": "2025-02-06T03:22:57.531589Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:26.885418Z",
     "iopub.status.busy": "2025-02-07T05:29:26.885047Z",
     "iopub.status.idle": "2025-02-07T05:29:26.891044Z",
     "shell.execute_reply": "2025-02-07T05:29:26.890366Z",
     "shell.execute_reply.started": "2025-02-07T05:29:26.885394Z"
    },
    "id": "64y_NBHMN4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch.\n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = - np.inf\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:23:00.622493Z",
     "start_time": "2025-02-06T03:23:00.619816Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:28.583138Z",
     "iopub.status.busy": "2025-02-07T05:29:28.582784Z",
     "iopub.status.idle": "2025-02-07T05:29:28.588010Z",
     "shell.execute_reply": "2025-02-07T05:29:28.587235Z",
     "shell.execute_reply.started": "2025-02-07T05:29:28.583115Z"
    },
    "id": "Uk4PEb70N4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = - np.inf\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter\n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_AB84Qx1N4yX"
   },
   "source": [
    "### training & valuating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-06T03:23:29.989603Z",
     "start_time": "2025-02-06T03:23:29.986457Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:30.334825Z",
     "iopub.status.busy": "2025-02-07T05:29:30.334453Z",
     "iopub.status.idle": "2025-02-07T05:29:30.339604Z",
     "shell.execute_reply": "2025-02-07T05:29:30.338934Z",
     "shell.execute_reply.started": "2025-02-07T05:29:30.334798Z"
    },
    "id": "1mKPSFkON4yX",
    "tags": []
   },
   "outputs": [],
   "source": [
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    for batch in dataloader:\n",
    "        encoder_inputs = batch[\"encoder_inputs\"]\n",
    "        encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "        decoder_inputs = batch[\"decoder_inputs\"]\n",
    "        decoder_labels = batch[\"decoder_labels\"]\n",
    "        decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "\n",
    "        # 前向计算\n",
    "        outputs = model(\n",
    "            encoder_inputs=encoder_inputs,\n",
    "            decoder_inputs=decoder_inputs,\n",
    "            encoder_inputs_mask=encoder_inputs_mask\n",
    "            )\n",
    "        logits = outputs.logits\n",
    "        loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)         # 验证集损失\n",
    "        loss_list.append(loss.cpu().item())\n",
    "\n",
    "    return np.mean(loss_list)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.549252Z",
     "start_time": "2024-08-05T08:06:36.514271Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:32.906821Z",
     "iopub.status.busy": "2025-02-07T05:29:32.906451Z",
     "iopub.status.idle": "2025-02-07T05:29:32.916169Z",
     "shell.execute_reply": "2025-02-07T05:29:32.915486Z",
     "shell.execute_reply.started": "2025-02-07T05:29:32.906796Z"
    },
    "id": "PClBmtgWN4yY",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler=None,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 1\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for batch in train_loader:\n",
    "                encoder_inputs = batch[\"encoder_inputs\"]\n",
    "                encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "                decoder_inputs = batch[\"decoder_inputs\"]\n",
    "                decoder_labels = batch[\"decoder_labels\"]\n",
    "                decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 前向计算\n",
    "                outputs = model(\n",
    "                    encoder_inputs=encoder_inputs,\n",
    "                    decoder_inputs=decoder_inputs,\n",
    "                    encoder_inputs_mask=encoder_inputs_mask\n",
    "                    )\n",
    "                logits = outputs.logits\n",
    "                loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)\n",
    "\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                if scheduler is not None:\n",
    "                    scheduler.step() # 更新学习率\n",
    "\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    cur_lr = optimizer.param_groups[0][\"lr\"] if scheduler is None else scheduler.get_last_lr()[0]\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            lr=cur_lr,\n",
    "                            )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=-val_loss)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(-val_loss)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "            pbar.set_postfix({\"epoch\": epoch_id, \"loss\": loss, \"val_loss\": val_loss})\n",
    "\n",
    "    return record_dict\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.628920Z",
     "start_time": "2024-08-05T08:06:36.541257800Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:36.106538Z",
     "iopub.status.busy": "2025-02-07T05:29:36.106183Z",
     "iopub.status.idle": "2025-02-07T05:29:36.187531Z",
     "shell.execute_reply": "2025-02-07T05:29:36.186860Z",
     "shell.execute_reply.started": "2025-02-07T05:29:36.106514Z"
    },
    "id": "khZqMS8pN4yY",
    "outputId": "2367a363-585b-4321-f7ea-cb11d9623008",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load train dataset from wmt16/.cache/de2en_train_128.npy\n",
      "load val dataset from wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "#模型的超参\n",
    "config = {\n",
    "    \"bos_idx\": 1,\n",
    "    \"eos_idx\": 3,\n",
    "    \"pad_idx\": 0,\n",
    "    \"vocab_size\": len(word2idx),\n",
    "    \"max_length\": 128,\n",
    "    \"d_model\": 512,\n",
    "    \"dim_feedforward\": 2048, # FFN 的隐藏层大小\n",
    "    \"dropout\": 0.1,\n",
    "    \"layer_norm_eps\": 1e-6, # 层归一化的 epsilon, 防止除零错误\n",
    "    \"num_heads\": 8,\n",
    "    \"num_decoder_layers\": 6,\n",
    "    \"num_encoder_layers\": 6,\n",
    "    \"label_smoothing\": 0.1,\n",
    "    \"beta1\": 0.9, # Adam 的 beta1\n",
    "    \"beta2\": 0.98,\n",
    "    \"eps\": 1e-9,\n",
    "    \"warmup_steps\": 4_000,\n",
    "    \"share_embedding\": False, # 是否共享词向量\n",
    "    }\n",
    "\n",
    "\n",
    "def get_dl(dataset, batch_size, shuffle=True):\n",
    "    sampler = TransformerBatchSampler(dataset, batch_size=batch_size, shuffle_batch=shuffle)\n",
    "    sample_dl = DataLoader(dataset, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "    return sample_dl\n",
    "\n",
    "# dataset\n",
    "train_ds = LangPairDataset(\"train\", max_length=config[\"max_length\"])\n",
    "val_ds = LangPairDataset(\"val\", max_length=config[\"max_length\"])\n",
    "# tokenizer\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word, max_length=config[\"max_length\"])\n",
    "batch_size = 2048\n",
    "# dataloader\n",
    "train_dl = get_dl(train_ds, batch_size=batch_size, shuffle=True)\n",
    "val_dl = get_dl(val_ds, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:52:53.233851300Z",
     "start_time": "2024-08-05T08:52:51.458743700Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:38.011775Z",
     "iopub.status.busy": "2025-02-07T05:29:38.011400Z",
     "iopub.status.idle": "2025-02-07T05:29:38.969980Z",
     "shell.execute_reply": "2025-02-07T05:29:38.969414Z",
     "shell.execute_reply.started": "2025-02-07T05:29:38.011750Z"
    },
    "jupyter": {
     "outputs_hidden": false
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型参数量: 71938239\n"
     ]
    }
   ],
   "source": [
    "#计算模型参数量\n",
    "model = TransformerModel(config)\n",
    "print(f\"模型参数量: {sum(p.numel() for p in model.parameters() if p.requires_grad)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-07T08:52:38.372364400Z",
     "start_time": "2024-05-07T08:52:38.191467100Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:29:40.381309Z",
     "iopub.status.busy": "2025-02-07T05:29:40.380947Z",
     "iopub.status.idle": "2025-02-07T05:29:40.385528Z",
     "shell.execute_reply": "2025-02-07T05:29:40.384896Z",
     "shell.execute_reply.started": "2025-02-07T05:29:40.381284Z"
    },
    "id": "63slV04gWLn8",
    "outputId": "5c5ede03-0f6f-48d5-a177-d961886ec340",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bos_idx': 1,\n",
       " 'eos_idx': 3,\n",
       " 'pad_idx': 0,\n",
       " 'vocab_size': 18111,\n",
       " 'max_length': 128,\n",
       " 'd_model': 512,\n",
       " 'dim_feedforward': 2048,\n",
       " 'dropout': 0.1,\n",
       " 'layer_norm_eps': 1e-06,\n",
       " 'num_heads': 8,\n",
       " 'num_decoder_layers': 6,\n",
       " 'num_encoder_layers': 6,\n",
       " 'label_smoothing': 0.1,\n",
       " 'beta1': 0.9,\n",
       " 'beta2': 0.98,\n",
       " 'eps': 1e-09,\n",
       " 'warmup_steps': 4000,\n",
       " 'share_embedding': False}"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "55146ac7395840dca847e0f63aa80561",
      "abb9bc76c0ce4634bd340be20c074b8c",
      "a89d790df59245fcaf26335d4903c9b4",
      "f837255914194dc792cf1514dee03dc5",
      "46a51a1719d8444eb5877720253d3c37",
      "013d2a6b90144432bbfb15136235faba",
      "2b82e42c34804b13bc83be4c7009d4e2",
      "9233439bdd6746c28ad4a20ef47799f6",
      "0e10428326bc436e8dbc079e89570bde",
      "0fe4ed7283c04496affe727c235d31c4",
      "0c0c7229347b49ffbb9a0f7bd41199b9"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:32:00.207434Z",
     "iopub.status.busy": "2025-02-07T05:32:00.207094Z",
     "iopub.status.idle": "2025-02-07T05:32:01.170414Z",
     "shell.execute_reply": "2025-02-07T05:32:01.169862Z",
     "shell.execute_reply.started": "2025-02-07T05:32:00.207408Z"
    },
    "id": "tVO2zJ04N4yY",
    "outputId": "7d4079f5-65d4-4da1-9001-91aa5525250e",
    "tags": []
   },
   "outputs": [],
   "source": [
    "epoch = 100\n",
    "\n",
    "# model\n",
    "model = TransformerModel(config)\n",
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer, scheduler = get_optimizer(model, config)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "exp_name = \"translate-transformer-{}\".format(\"share\" if config[\"share_embedding\"] else \"not-share\")\n",
    "tensorboard_callback = TensorBoardCallback(f\"runs/{exp_name}\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\n",
    "    f\"checkpoints/{exp_name}\", save_step=500, save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10,min_delta=0.01)\n",
    "\n",
    "model = model.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "55146ac7395840dca847e0f63aa80561",
      "abb9bc76c0ce4634bd340be20c074b8c",
      "a89d790df59245fcaf26335d4903c9b4",
      "f837255914194dc792cf1514dee03dc5",
      "46a51a1719d8444eb5877720253d3c37",
      "013d2a6b90144432bbfb15136235faba",
      "2b82e42c34804b13bc83be4c7009d4e2",
      "9233439bdd6746c28ad4a20ef47799f6",
      "0e10428326bc436e8dbc079e89570bde",
      "0fe4ed7283c04496affe727c235d31c4",
      "0c0c7229347b49ffbb9a0f7bd41199b9"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:32:03.639710Z",
     "iopub.status.busy": "2025-02-07T05:32:03.639342Z",
     "iopub.status.idle": "2025-02-07T05:54:25.731340Z",
     "shell.execute_reply": "2025-02-07T05:54:25.730815Z",
     "shell.execute_reply.started": "2025-02-07T05:32:03.639672Z"
    },
    "id": "tVO2zJ04N4yY",
    "outputId": "7d4079f5-65d4-4da1-9001-91aa5525250e",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 33%|███▎      | 33999/104200 [22:22<46:11, 25.33it/s, epoch=31, loss=2.8, val_loss=3.44]   "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 32 / global_step 34000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    val_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler,\n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=500\n",
    "    )\n",
    "\n",
    "\n",
    "# We trained the base models for a total of 100,000 steps or 12 hours. For our big models,(described on the bottom line of table 3), step time was 1.0 seconds. The big models were trained for 300,000 steps (3.5 days)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T06:03:02.898003Z",
     "iopub.status.busy": "2025-02-07T06:03:02.897624Z",
     "iopub.status.idle": "2025-02-07T06:03:02.950471Z",
     "shell.execute_reply": "2025-02-07T06:03:02.949999Z",
     "shell.execute_reply.started": "2025-02-07T06:03:02.897977Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 9.815095901489258, 'step': 1},\n",
       "  {'loss': 9.82260799407959, 'step': 2},\n",
       "  {'loss': 9.792125701904297, 'step': 3},\n",
       "  {'loss': 9.810640335083008, 'step': 4},\n",
       "  {'loss': 9.805207252502441, 'step': 5},\n",
       "  {'loss': 9.82711124420166, 'step': 6},\n",
       "  {'loss': 9.804364204406738, 'step': 7},\n",
       "  {'loss': 9.811119079589844, 'step': 8},\n",
       "  {'loss': 9.810644149780273, 'step': 9},\n",
       "  {'loss': 9.78149700164795, 'step': 10},\n",
       "  {'loss': 9.810220718383789, 'step': 11},\n",
       "  {'loss': 9.787816047668457, 'step': 12},\n",
       "  {'loss': 9.794591903686523, 'step': 13},\n",
       "  {'loss': 9.728022575378418, 'step': 14},\n",
       "  {'loss': 9.7901611328125, 'step': 15},\n",
       "  {'loss': 9.77316951751709, 'step': 16},\n",
       "  {'loss': 9.810286521911621, 'step': 17},\n",
       "  {'loss': 9.802512168884277, 'step': 18},\n",
       "  {'loss': 9.800960540771484, 'step': 19},\n",
       "  {'loss': 9.76965618133545, 'step': 20},\n",
       "  {'loss': 9.76776123046875, 'step': 21},\n",
       "  {'loss': 9.776195526123047, 'step': 22},\n",
       "  {'loss': 9.761940956115723, 'step': 23},\n",
       "  {'loss': 9.774168014526367, 'step': 24},\n",
       "  {'loss': 9.768499374389648, 'step': 25},\n",
       "  {'loss': 9.773591041564941, 'step': 26},\n",
       "  {'loss': 9.77011775970459, 'step': 27},\n",
       "  {'loss': 9.778962135314941, 'step': 28},\n",
       "  {'loss': 9.759223937988281, 'step': 29},\n",
       "  {'loss': 9.743659973144531, 'step': 30},\n",
       "  {'loss': 9.753801345825195, 'step': 31},\n",
       "  {'loss': 9.730752944946289, 'step': 32},\n",
       "  {'loss': 9.738591194152832, 'step': 33},\n",
       "  {'loss': 9.737608909606934, 'step': 34},\n",
       "  {'loss': 9.752501487731934, 'step': 35},\n",
       "  {'loss': 9.71548080444336, 'step': 36},\n",
       "  {'loss': 9.750982284545898, 'step': 37},\n",
       "  {'loss': 9.70605754852295, 'step': 38},\n",
       "  {'loss': 9.714554786682129, 'step': 39},\n",
       "  {'loss': 9.722735404968262, 'step': 40},\n",
       "  {'loss': 9.715478897094727, 'step': 41},\n",
       "  {'loss': 9.684382438659668, 'step': 42},\n",
       "  {'loss': 9.69584846496582, 'step': 43},\n",
       "  {'loss': 9.69859790802002, 'step': 44},\n",
       "  {'loss': 9.701162338256836, 'step': 45},\n",
       "  {'loss': 9.68694019317627, 'step': 46},\n",
       "  {'loss': 9.656085968017578, 'step': 47},\n",
       "  {'loss': 9.641048431396484, 'step': 48},\n",
       "  {'loss': 9.637630462646484, 'step': 49},\n",
       "  {'loss': 9.637720108032227, 'step': 50},\n",
       "  {'loss': 9.668044090270996, 'step': 51},\n",
       "  {'loss': 9.610452651977539, 'step': 52},\n",
       "  {'loss': 9.688736915588379, 'step': 53},\n",
       "  {'loss': 9.65638542175293, 'step': 54},\n",
       "  {'loss': 9.660699844360352, 'step': 55},\n",
       "  {'loss': 9.632377624511719, 'step': 56},\n",
       "  {'loss': 9.597472190856934, 'step': 57},\n",
       "  {'loss': 9.599760055541992, 'step': 58},\n",
       "  {'loss': 9.551063537597656, 'step': 59},\n",
       "  {'loss': 9.60800552368164, 'step': 60},\n",
       "  {'loss': 9.590409278869629, 'step': 61},\n",
       "  {'loss': 9.577995300292969, 'step': 62},\n",
       "  {'loss': 9.588133811950684, 'step': 63},\n",
       "  {'loss': 9.553121566772461, 'step': 64},\n",
       "  {'loss': 9.612728118896484, 'step': 65},\n",
       "  {'loss': 9.549227714538574, 'step': 66},\n",
       "  {'loss': 9.60095500946045, 'step': 67},\n",
       "  {'loss': 9.577616691589355, 'step': 68},\n",
       "  {'loss': 9.572461128234863, 'step': 69},\n",
       "  {'loss': 9.545605659484863, 'step': 70},\n",
       "  {'loss': 9.579845428466797, 'step': 71},\n",
       "  {'loss': 9.548531532287598, 'step': 72},\n",
       "  {'loss': 9.547870635986328, 'step': 73},\n",
       "  {'loss': 9.55965518951416, 'step': 74},\n",
       "  {'loss': 9.458077430725098, 'step': 75},\n",
       "  {'loss': 9.440781593322754, 'step': 76},\n",
       "  {'loss': 9.508438110351562, 'step': 77},\n",
       "  {'loss': 9.484950065612793, 'step': 78},\n",
       "  {'loss': 9.533186912536621, 'step': 79},\n",
       "  {'loss': 9.480674743652344, 'step': 80},\n",
       "  {'loss': 9.519243240356445, 'step': 81},\n",
       "  {'loss': 9.518532752990723, 'step': 82},\n",
       "  {'loss': 9.404862403869629, 'step': 83},\n",
       "  {'loss': 9.457222938537598, 'step': 84},\n",
       "  {'loss': 9.42810344696045, 'step': 85},\n",
       "  {'loss': 9.528104782104492, 'step': 86},\n",
       "  {'loss': 9.463377952575684, 'step': 87},\n",
       "  {'loss': 9.440442085266113, 'step': 88},\n",
       "  {'loss': 9.416122436523438, 'step': 89},\n",
       "  {'loss': 9.48338794708252, 'step': 90},\n",
       "  {'loss': 9.470620155334473, 'step': 91},\n",
       "  {'loss': 9.402017593383789, 'step': 92},\n",
       "  {'loss': 9.366992950439453, 'step': 93},\n",
       "  {'loss': 9.45078182220459, 'step': 94},\n",
       "  {'loss': 9.400816917419434, 'step': 95},\n",
       "  {'loss': 9.3330717086792, 'step': 96},\n",
       "  {'loss': 9.357148170471191, 'step': 97},\n",
       "  {'loss': 9.366039276123047, 'step': 98},\n",
       "  {'loss': 9.362536430358887, 'step': 99},\n",
       "  {'loss': 9.343219757080078, 'step': 100},\n",
       "  {'loss': 9.353716850280762, 'step': 101},\n",
       "  {'loss': 9.345494270324707, 'step': 102},\n",
       "  {'loss': 9.324797630310059, 'step': 103},\n",
       "  {'loss': 9.33694839477539, 'step': 104},\n",
       "  {'loss': 9.32654857635498, 'step': 105},\n",
       "  {'loss': 9.277423858642578, 'step': 106},\n",
       "  {'loss': 9.381673812866211, 'step': 107},\n",
       "  {'loss': 9.36925220489502, 'step': 108},\n",
       "  {'loss': 9.2907133102417, 'step': 109},\n",
       "  {'loss': 9.255175590515137, 'step': 110},\n",
       "  {'loss': 9.367773056030273, 'step': 111},\n",
       "  {'loss': 9.275065422058105, 'step': 112},\n",
       "  {'loss': 9.38587474822998, 'step': 113},\n",
       "  {'loss': 9.349784851074219, 'step': 114},\n",
       "  {'loss': 9.341763496398926, 'step': 115},\n",
       "  {'loss': 9.36884593963623, 'step': 116},\n",
       "  {'loss': 9.32836627960205, 'step': 117},\n",
       "  {'loss': 9.289677619934082, 'step': 118},\n",
       "  {'loss': 9.216721534729004, 'step': 119},\n",
       "  {'loss': 9.277634620666504, 'step': 120},\n",
       "  {'loss': 9.312922477722168, 'step': 121},\n",
       "  {'loss': 9.223906517028809, 'step': 122},\n",
       "  {'loss': 9.276896476745605, 'step': 123},\n",
       "  {'loss': 9.302999496459961, 'step': 124},\n",
       "  {'loss': 9.16073226928711, 'step': 125},\n",
       "  {'loss': 9.244377136230469, 'step': 126},\n",
       "  {'loss': 9.144323348999023, 'step': 127},\n",
       "  {'loss': 9.202095985412598, 'step': 128},\n",
       "  {'loss': 9.277692794799805, 'step': 129},\n",
       "  {'loss': 9.233680725097656, 'step': 130},\n",
       "  {'loss': 9.259583473205566, 'step': 131},\n",
       "  {'loss': 9.291162490844727, 'step': 132},\n",
       "  {'loss': 9.224221229553223, 'step': 133},\n",
       "  {'loss': 9.203503608703613, 'step': 134},\n",
       "  {'loss': 9.13381290435791, 'step': 135},\n",
       "  {'loss': 9.324172019958496, 'step': 136},\n",
       "  {'loss': 9.309331893920898, 'step': 137},\n",
       "  {'loss': 9.263227462768555, 'step': 138},\n",
       "  {'loss': 9.222090721130371, 'step': 139},\n",
       "  {'loss': 9.166361808776855, 'step': 140},\n",
       "  {'loss': 9.168593406677246, 'step': 141},\n",
       "  {'loss': 9.315469741821289, 'step': 142},\n",
       "  {'loss': 9.197372436523438, 'step': 143},\n",
       "  {'loss': 9.194851875305176, 'step': 144},\n",
       "  {'loss': 9.226093292236328, 'step': 145},\n",
       "  {'loss': 9.2962646484375, 'step': 146},\n",
       "  {'loss': 9.13942813873291, 'step': 147},\n",
       "  {'loss': 8.981542587280273, 'step': 148},\n",
       "  {'loss': 9.285944938659668, 'step': 149},\n",
       "  {'loss': 9.165032386779785, 'step': 150},\n",
       "  {'loss': 9.097569465637207, 'step': 151},\n",
       "  {'loss': 8.956446647644043, 'step': 152},\n",
       "  {'loss': 9.044981002807617, 'step': 153},\n",
       "  {'loss': 9.180912017822266, 'step': 154},\n",
       "  {'loss': 8.978333473205566, 'step': 155},\n",
       "  {'loss': 9.245566368103027, 'step': 156},\n",
       "  {'loss': 9.089229583740234, 'step': 157},\n",
       "  {'loss': 9.09902286529541, 'step': 158},\n",
       "  {'loss': 9.150301933288574, 'step': 159},\n",
       "  {'loss': 9.096022605895996, 'step': 160},\n",
       "  {'loss': 8.977907180786133, 'step': 161},\n",
       "  {'loss': 9.105066299438477, 'step': 162},\n",
       "  {'loss': 9.245227813720703, 'step': 163},\n",
       "  {'loss': 9.032751083374023, 'step': 164},\n",
       "  {'loss': 9.003775596618652, 'step': 165},\n",
       "  {'loss': 9.14087963104248, 'step': 166},\n",
       "  {'loss': 9.120928764343262, 'step': 167},\n",
       "  {'loss': 9.000651359558105, 'step': 168},\n",
       "  {'loss': 9.016087532043457, 'step': 169},\n",
       "  {'loss': 9.113556861877441, 'step': 170},\n",
       "  {'loss': 8.965455055236816, 'step': 171},\n",
       "  {'loss': 9.06991958618164, 'step': 172},\n",
       "  {'loss': 9.110556602478027, 'step': 173},\n",
       "  {'loss': 9.192500114440918, 'step': 174},\n",
       "  {'loss': 9.104630470275879, 'step': 175},\n",
       "  {'loss': 9.028884887695312, 'step': 176},\n",
       "  {'loss': 9.058331489562988, 'step': 177},\n",
       "  {'loss': 9.103928565979004, 'step': 178},\n",
       "  {'loss': 9.157032012939453, 'step': 179},\n",
       "  {'loss': 9.22634220123291, 'step': 180},\n",
       "  {'loss': 8.976919174194336, 'step': 181},\n",
       "  {'loss': 9.101825714111328, 'step': 182},\n",
       "  {'loss': 9.066978454589844, 'step': 183},\n",
       "  {'loss': 9.11611270904541, 'step': 184},\n",
       "  {'loss': 9.055657386779785, 'step': 185},\n",
       "  {'loss': 8.995429992675781, 'step': 186},\n",
       "  {'loss': 9.132105827331543, 'step': 187},\n",
       "  {'loss': 9.023120880126953, 'step': 188},\n",
       "  {'loss': 9.002114295959473, 'step': 189},\n",
       "  {'loss': 8.933889389038086, 'step': 190},\n",
       "  {'loss': 9.032039642333984, 'step': 191},\n",
       "  {'loss': 8.990532875061035, 'step': 192},\n",
       "  {'loss': 8.926884651184082, 'step': 193},\n",
       "  {'loss': 9.084288597106934, 'step': 194},\n",
       "  {'loss': 8.929494857788086, 'step': 195},\n",
       "  {'loss': 8.982353210449219, 'step': 196},\n",
       "  {'loss': 9.11938762664795, 'step': 197},\n",
       "  {'loss': 9.074065208435059, 'step': 198},\n",
       "  {'loss': 8.912036895751953, 'step': 199},\n",
       "  {'loss': 8.958642959594727, 'step': 200},\n",
       "  {'loss': 9.054359436035156, 'step': 201},\n",
       "  {'loss': 8.897761344909668, 'step': 202},\n",
       "  {'loss': 9.127257347106934, 'step': 203},\n",
       "  {'loss': 8.980536460876465, 'step': 204},\n",
       "  {'loss': 8.913247108459473, 'step': 205},\n",
       "  {'loss': 9.018804550170898, 'step': 206},\n",
       "  {'loss': 8.909975051879883, 'step': 207},\n",
       "  {'loss': 8.998269081115723, 'step': 208},\n",
       "  {'loss': 8.887887954711914, 'step': 209},\n",
       "  {'loss': 8.987921714782715, 'step': 210},\n",
       "  {'loss': 8.788307189941406, 'step': 211},\n",
       "  {'loss': 8.770784378051758, 'step': 212},\n",
       "  {'loss': 8.936908721923828, 'step': 213},\n",
       "  {'loss': 8.923026084899902, 'step': 214},\n",
       "  {'loss': 9.081639289855957, 'step': 215},\n",
       "  {'loss': 9.027743339538574, 'step': 216},\n",
       "  {'loss': 9.030893325805664, 'step': 217},\n",
       "  {'loss': 9.104683876037598, 'step': 218},\n",
       "  {'loss': 9.050213813781738, 'step': 219},\n",
       "  {'loss': 9.043914794921875, 'step': 220},\n",
       "  {'loss': 9.09735107421875, 'step': 221},\n",
       "  {'loss': 8.915867805480957, 'step': 222},\n",
       "  {'loss': 8.941080093383789, 'step': 223},\n",
       "  {'loss': 9.002920150756836, 'step': 224},\n",
       "  {'loss': 9.03742504119873, 'step': 225},\n",
       "  {'loss': 8.844659805297852, 'step': 226},\n",
       "  {'loss': 9.025646209716797, 'step': 227},\n",
       "  {'loss': 8.944900512695312, 'step': 228},\n",
       "  {'loss': 8.948959350585938, 'step': 229},\n",
       "  {'loss': 8.984625816345215, 'step': 230},\n",
       "  {'loss': 8.715069770812988, 'step': 231},\n",
       "  {'loss': 8.952312469482422, 'step': 232},\n",
       "  {'loss': 8.840054512023926, 'step': 233},\n",
       "  {'loss': 9.06727409362793, 'step': 234},\n",
       "  {'loss': 8.903680801391602, 'step': 235},\n",
       "  {'loss': 8.878734588623047, 'step': 236},\n",
       "  {'loss': 8.871843338012695, 'step': 237},\n",
       "  {'loss': 8.933826446533203, 'step': 238},\n",
       "  {'loss': 9.024024963378906, 'step': 239},\n",
       "  {'loss': 8.891088485717773, 'step': 240},\n",
       "  {'loss': 8.908885955810547, 'step': 241},\n",
       "  {'loss': 8.884833335876465, 'step': 242},\n",
       "  {'loss': 8.873900413513184, 'step': 243},\n",
       "  {'loss': 8.77258586883545, 'step': 244},\n",
       "  {'loss': 8.920961380004883, 'step': 245},\n",
       "  {'loss': 9.027726173400879, 'step': 246},\n",
       "  {'loss': 8.883868217468262, 'step': 247},\n",
       "  {'loss': 8.90733814239502, 'step': 248},\n",
       "  {'loss': 8.686470031738281, 'step': 249},\n",
       "  {'loss': 8.617923736572266, 'step': 250},\n",
       "  {'loss': 8.932506561279297, 'step': 251},\n",
       "  {'loss': 8.659709930419922, 'step': 252},\n",
       "  {'loss': 8.894501686096191, 'step': 253},\n",
       "  {'loss': 8.596626281738281, 'step': 254},\n",
       "  {'loss': 8.719184875488281, 'step': 255},\n",
       "  {'loss': 8.818029403686523, 'step': 256},\n",
       "  {'loss': 8.78742504119873, 'step': 257},\n",
       "  {'loss': 8.896288871765137, 'step': 258},\n",
       "  {'loss': 8.860088348388672, 'step': 259},\n",
       "  {'loss': 8.699766159057617, 'step': 260},\n",
       "  {'loss': 8.698101997375488, 'step': 261},\n",
       "  {'loss': 8.690722465515137, 'step': 262},\n",
       "  {'loss': 8.716656684875488, 'step': 263},\n",
       "  {'loss': 8.967535018920898, 'step': 264},\n",
       "  {'loss': 8.862019538879395, 'step': 265},\n",
       "  {'loss': 8.596495628356934, 'step': 266},\n",
       "  {'loss': 8.909102439880371, 'step': 267},\n",
       "  {'loss': 8.859415054321289, 'step': 268},\n",
       "  {'loss': 8.81124496459961, 'step': 269},\n",
       "  {'loss': 8.650090217590332, 'step': 270},\n",
       "  {'loss': 8.652877807617188, 'step': 271},\n",
       "  {'loss': 8.826178550720215, 'step': 272},\n",
       "  {'loss': 8.830656051635742, 'step': 273},\n",
       "  {'loss': 8.61985969543457, 'step': 274},\n",
       "  {'loss': 8.98947811126709, 'step': 275},\n",
       "  {'loss': 8.691169738769531, 'step': 276},\n",
       "  {'loss': 8.675007820129395, 'step': 277},\n",
       "  {'loss': 8.682036399841309, 'step': 278},\n",
       "  {'loss': 8.786232948303223, 'step': 279},\n",
       "  {'loss': 8.612364768981934, 'step': 280},\n",
       "  {'loss': 8.793368339538574, 'step': 281},\n",
       "  {'loss': 8.832070350646973, 'step': 282},\n",
       "  {'loss': 8.741491317749023, 'step': 283},\n",
       "  {'loss': 8.818493843078613, 'step': 284},\n",
       "  {'loss': 8.82646369934082, 'step': 285},\n",
       "  {'loss': 8.808951377868652, 'step': 286},\n",
       "  {'loss': 8.597002983093262, 'step': 287},\n",
       "  {'loss': 8.94082260131836, 'step': 288},\n",
       "  {'loss': 8.670134544372559, 'step': 289},\n",
       "  {'loss': 8.75631332397461, 'step': 290},\n",
       "  {'loss': 8.923563957214355, 'step': 291},\n",
       "  {'loss': 8.685246467590332, 'step': 292},\n",
       "  {'loss': 8.60089111328125, 'step': 293},\n",
       "  {'loss': 8.784269332885742, 'step': 294},\n",
       "  {'loss': 8.54166030883789, 'step': 295},\n",
       "  {'loss': 8.803009986877441, 'step': 296},\n",
       "  {'loss': 8.794647216796875, 'step': 297},\n",
       "  {'loss': 8.67879581451416, 'step': 298},\n",
       "  {'loss': 8.71362018585205, 'step': 299},\n",
       "  {'loss': 8.83901596069336, 'step': 300},\n",
       "  {'loss': 8.647071838378906, 'step': 301},\n",
       "  {'loss': 8.698573112487793, 'step': 302},\n",
       "  {'loss': 8.603850364685059, 'step': 303},\n",
       "  {'loss': 8.771414756774902, 'step': 304},\n",
       "  {'loss': 8.834510803222656, 'step': 305},\n",
       "  {'loss': 8.796989440917969, 'step': 306},\n",
       "  {'loss': 8.644176483154297, 'step': 307},\n",
       "  {'loss': 8.4951810836792, 'step': 308},\n",
       "  {'loss': 8.746320724487305, 'step': 309},\n",
       "  {'loss': 8.628944396972656, 'step': 310},\n",
       "  {'loss': 8.695366859436035, 'step': 311},\n",
       "  {'loss': 8.644265174865723, 'step': 312},\n",
       "  {'loss': 8.552745819091797, 'step': 313},\n",
       "  {'loss': 8.778115272521973, 'step': 314},\n",
       "  {'loss': 8.656664848327637, 'step': 315},\n",
       "  {'loss': 8.831703186035156, 'step': 316},\n",
       "  {'loss': 8.63450813293457, 'step': 317},\n",
       "  {'loss': 8.402771949768066, 'step': 318},\n",
       "  {'loss': 8.696320533752441, 'step': 319},\n",
       "  {'loss': 8.540938377380371, 'step': 320},\n",
       "  {'loss': 8.59070110321045, 'step': 321},\n",
       "  {'loss': 8.779001235961914, 'step': 322},\n",
       "  {'loss': 8.588027954101562, 'step': 323},\n",
       "  {'loss': 8.534059524536133, 'step': 324},\n",
       "  {'loss': 8.495838165283203, 'step': 325},\n",
       "  {'loss': 8.447114944458008, 'step': 326},\n",
       "  {'loss': 8.509337425231934, 'step': 327},\n",
       "  {'loss': 8.634343147277832, 'step': 328},\n",
       "  {'loss': 8.553705215454102, 'step': 329},\n",
       "  {'loss': 8.673686981201172, 'step': 330},\n",
       "  {'loss': 8.62304973602295, 'step': 331},\n",
       "  {'loss': 8.596755981445312, 'step': 332},\n",
       "  {'loss': 8.549173355102539, 'step': 333},\n",
       "  {'loss': 8.666824340820312, 'step': 334},\n",
       "  {'loss': 8.496565818786621, 'step': 335},\n",
       "  {'loss': 8.501276016235352, 'step': 336},\n",
       "  {'loss': 8.667237281799316, 'step': 337},\n",
       "  {'loss': 8.543275833129883, 'step': 338},\n",
       "  {'loss': 8.457536697387695, 'step': 339},\n",
       "  {'loss': 8.781190872192383, 'step': 340},\n",
       "  {'loss': 8.570526123046875, 'step': 341},\n",
       "  {'loss': 8.272100448608398, 'step': 342},\n",
       "  {'loss': 8.681127548217773, 'step': 343},\n",
       "  {'loss': 8.570809364318848, 'step': 344},\n",
       "  {'loss': 8.530228614807129, 'step': 345},\n",
       "  {'loss': 8.60892391204834, 'step': 346},\n",
       "  {'loss': 8.483752250671387, 'step': 347},\n",
       "  {'loss': 8.659947395324707, 'step': 348},\n",
       "  {'loss': 8.369479179382324, 'step': 349},\n",
       "  {'loss': 8.471711158752441, 'step': 350},\n",
       "  {'loss': 8.563373565673828, 'step': 351},\n",
       "  {'loss': 8.470882415771484, 'step': 352},\n",
       "  {'loss': 8.328085899353027, 'step': 353},\n",
       "  {'loss': 8.638586044311523, 'step': 354},\n",
       "  {'loss': 8.311768531799316, 'step': 355},\n",
       "  {'loss': 8.458538055419922, 'step': 356},\n",
       "  {'loss': 8.468339920043945, 'step': 357},\n",
       "  {'loss': 8.489401817321777, 'step': 358},\n",
       "  {'loss': 8.38132381439209, 'step': 359},\n",
       "  {'loss': 8.519783020019531, 'step': 360},\n",
       "  {'loss': 8.548572540283203, 'step': 361},\n",
       "  {'loss': 8.45671272277832, 'step': 362},\n",
       "  {'loss': 8.535181999206543, 'step': 363},\n",
       "  {'loss': 8.543558120727539, 'step': 364},\n",
       "  {'loss': 8.328746795654297, 'step': 365},\n",
       "  {'loss': 8.306622505187988, 'step': 366},\n",
       "  {'loss': 8.502179145812988, 'step': 367},\n",
       "  {'loss': 8.454702377319336, 'step': 368},\n",
       "  {'loss': 8.624151229858398, 'step': 369},\n",
       "  {'loss': 8.475066184997559, 'step': 370},\n",
       "  {'loss': 8.318984031677246, 'step': 371},\n",
       "  {'loss': 8.153837203979492, 'step': 372},\n",
       "  {'loss': 8.331735610961914, 'step': 373},\n",
       "  {'loss': 8.687333106994629, 'step': 374},\n",
       "  {'loss': 8.439635276794434, 'step': 375},\n",
       "  {'loss': 8.36821460723877, 'step': 376},\n",
       "  {'loss': 8.590971946716309, 'step': 377},\n",
       "  {'loss': 8.623213768005371, 'step': 378},\n",
       "  {'loss': 8.343267440795898, 'step': 379},\n",
       "  {'loss': 8.395750999450684, 'step': 380},\n",
       "  {'loss': 8.385051727294922, 'step': 381},\n",
       "  {'loss': 8.51683521270752, 'step': 382},\n",
       "  {'loss': 8.504796028137207, 'step': 383},\n",
       "  {'loss': 8.563617706298828, 'step': 384},\n",
       "  {'loss': 8.270345687866211, 'step': 385},\n",
       "  {'loss': 8.31303882598877, 'step': 386},\n",
       "  {'loss': 8.457578659057617, 'step': 387},\n",
       "  {'loss': 8.530025482177734, 'step': 388},\n",
       "  {'loss': 8.504611015319824, 'step': 389},\n",
       "  {'loss': 8.488563537597656, 'step': 390},\n",
       "  {'loss': 8.338879585266113, 'step': 391},\n",
       "  {'loss': 8.51391887664795, 'step': 392},\n",
       "  {'loss': 8.289408683776855, 'step': 393},\n",
       "  {'loss': 8.42532730102539, 'step': 394},\n",
       "  {'loss': 8.426274299621582, 'step': 395},\n",
       "  {'loss': 8.146490097045898, 'step': 396},\n",
       "  {'loss': 8.42811107635498, 'step': 397},\n",
       "  {'loss': 8.258023262023926, 'step': 398},\n",
       "  {'loss': 8.19460678100586, 'step': 399},\n",
       "  {'loss': 8.242561340332031, 'step': 400},\n",
       "  {'loss': 8.387897491455078, 'step': 401},\n",
       "  {'loss': 8.194131851196289, 'step': 402},\n",
       "  {'loss': 8.477349281311035, 'step': 403},\n",
       "  {'loss': 8.277508735656738, 'step': 404},\n",
       "  {'loss': 8.330883026123047, 'step': 405},\n",
       "  {'loss': 8.19920825958252, 'step': 406},\n",
       "  {'loss': 8.194372177124023, 'step': 407},\n",
       "  {'loss': 8.483931541442871, 'step': 408},\n",
       "  {'loss': 8.548006057739258, 'step': 409},\n",
       "  {'loss': 8.432890892028809, 'step': 410},\n",
       "  {'loss': 8.43724250793457, 'step': 411},\n",
       "  {'loss': 8.227005004882812, 'step': 412},\n",
       "  {'loss': 8.231241226196289, 'step': 413},\n",
       "  {'loss': 8.42159366607666, 'step': 414},\n",
       "  {'loss': 8.177992820739746, 'step': 415},\n",
       "  {'loss': 8.31798267364502, 'step': 416},\n",
       "  {'loss': 8.273646354675293, 'step': 417},\n",
       "  {'loss': 8.269232749938965, 'step': 418},\n",
       "  {'loss': 8.043943405151367, 'step': 419},\n",
       "  {'loss': 8.345426559448242, 'step': 420},\n",
       "  {'loss': 8.135942459106445, 'step': 421},\n",
       "  {'loss': 8.410870552062988, 'step': 422},\n",
       "  {'loss': 8.201845169067383, 'step': 423},\n",
       "  {'loss': 8.313400268554688, 'step': 424},\n",
       "  {'loss': 8.131028175354004, 'step': 425},\n",
       "  {'loss': 8.415101051330566, 'step': 426},\n",
       "  {'loss': 8.334085464477539, 'step': 427},\n",
       "  {'loss': 8.018256187438965, 'step': 428},\n",
       "  {'loss': 8.20793628692627, 'step': 429},\n",
       "  {'loss': 8.02950382232666, 'step': 430},\n",
       "  {'loss': 8.359251976013184, 'step': 431},\n",
       "  {'loss': 8.324373245239258, 'step': 432},\n",
       "  {'loss': 8.157632827758789, 'step': 433},\n",
       "  {'loss': 8.102706909179688, 'step': 434},\n",
       "  {'loss': 8.360891342163086, 'step': 435},\n",
       "  {'loss': 8.27855110168457, 'step': 436},\n",
       "  {'loss': 8.30533218383789, 'step': 437},\n",
       "  {'loss': 7.8968915939331055, 'step': 438},\n",
       "  {'loss': 8.173943519592285, 'step': 439},\n",
       "  {'loss': 8.338727951049805, 'step': 440},\n",
       "  {'loss': 8.05327033996582, 'step': 441},\n",
       "  {'loss': 8.302024841308594, 'step': 442},\n",
       "  {'loss': 8.201440811157227, 'step': 443},\n",
       "  {'loss': 8.075671195983887, 'step': 444},\n",
       "  {'loss': 8.078495979309082, 'step': 445},\n",
       "  {'loss': 8.182167053222656, 'step': 446},\n",
       "  {'loss': 8.353898048400879, 'step': 447},\n",
       "  {'loss': 8.282391548156738, 'step': 448},\n",
       "  {'loss': 8.373284339904785, 'step': 449},\n",
       "  {'loss': 7.941777229309082, 'step': 450},\n",
       "  {'loss': 8.188735008239746, 'step': 451},\n",
       "  {'loss': 8.04232406616211, 'step': 452},\n",
       "  {'loss': 7.968739986419678, 'step': 453},\n",
       "  {'loss': 8.13784122467041, 'step': 454},\n",
       "  {'loss': 8.219902992248535, 'step': 455},\n",
       "  {'loss': 8.003907203674316, 'step': 456},\n",
       "  {'loss': 8.091349601745605, 'step': 457},\n",
       "  {'loss': 7.983500957489014, 'step': 458},\n",
       "  {'loss': 8.008139610290527, 'step': 459},\n",
       "  {'loss': 8.107528686523438, 'step': 460},\n",
       "  {'loss': 7.835114002227783, 'step': 461},\n",
       "  {'loss': 8.057880401611328, 'step': 462},\n",
       "  {'loss': 8.276945114135742, 'step': 463},\n",
       "  {'loss': 7.896355152130127, 'step': 464},\n",
       "  {'loss': 8.018449783325195, 'step': 465},\n",
       "  {'loss': 8.210185050964355, 'step': 466},\n",
       "  {'loss': 8.191083908081055, 'step': 467},\n",
       "  {'loss': 8.159029960632324, 'step': 468},\n",
       "  {'loss': 8.193737030029297, 'step': 469},\n",
       "  {'loss': 8.180450439453125, 'step': 470},\n",
       "  {'loss': 8.115591049194336, 'step': 471},\n",
       "  {'loss': 7.902661323547363, 'step': 472},\n",
       "  {'loss': 7.95053243637085, 'step': 473},\n",
       "  {'loss': 7.8875885009765625, 'step': 474},\n",
       "  {'loss': 7.739741325378418, 'step': 475},\n",
       "  {'loss': 7.955104827880859, 'step': 476},\n",
       "  {'loss': 8.02522087097168, 'step': 477},\n",
       "  {'loss': 7.982712268829346, 'step': 478},\n",
       "  {'loss': 8.116135597229004, 'step': 479},\n",
       "  {'loss': 7.8895583152771, 'step': 480},\n",
       "  {'loss': 8.172527313232422, 'step': 481},\n",
       "  {'loss': 7.916590213775635, 'step': 482},\n",
       "  {'loss': 7.870120048522949, 'step': 483},\n",
       "  {'loss': 8.000530242919922, 'step': 484},\n",
       "  {'loss': 7.804428577423096, 'step': 485},\n",
       "  {'loss': 7.935561656951904, 'step': 486},\n",
       "  {'loss': 7.849348068237305, 'step': 487},\n",
       "  {'loss': 8.030484199523926, 'step': 488},\n",
       "  {'loss': 7.79509973526001, 'step': 489},\n",
       "  {'loss': 7.731232166290283, 'step': 490},\n",
       "  {'loss': 7.6776838302612305, 'step': 491},\n",
       "  {'loss': 7.990560054779053, 'step': 492},\n",
       "  {'loss': 7.907598495483398, 'step': 493},\n",
       "  {'loss': 7.723148822784424, 'step': 494},\n",
       "  {'loss': 8.033578872680664, 'step': 495},\n",
       "  {'loss': 8.183465003967285, 'step': 496},\n",
       "  {'loss': 7.635659694671631, 'step': 497},\n",
       "  {'loss': 7.934788227081299, 'step': 498},\n",
       "  {'loss': 7.697114944458008, 'step': 499},\n",
       "  {'loss': 7.947981834411621, 'step': 500},\n",
       "  {'loss': 7.962534427642822, 'step': 501},\n",
       "  {'loss': 8.049789428710938, 'step': 502},\n",
       "  {'loss': 8.057661056518555, 'step': 503},\n",
       "  {'loss': 8.148262977600098, 'step': 504},\n",
       "  {'loss': 7.907973289489746, 'step': 505},\n",
       "  {'loss': 8.113682746887207, 'step': 506},\n",
       "  {'loss': 7.86937952041626, 'step': 507},\n",
       "  {'loss': 7.770104885101318, 'step': 508},\n",
       "  {'loss': 7.927188873291016, 'step': 509},\n",
       "  {'loss': 7.924787521362305, 'step': 510},\n",
       "  {'loss': 7.732999801635742, 'step': 511},\n",
       "  {'loss': 7.646113395690918, 'step': 512},\n",
       "  {'loss': 7.638083457946777, 'step': 513},\n",
       "  {'loss': 7.680116176605225, 'step': 514},\n",
       "  {'loss': 7.894207954406738, 'step': 515},\n",
       "  {'loss': 7.926363945007324, 'step': 516},\n",
       "  {'loss': 7.778049945831299, 'step': 517},\n",
       "  {'loss': 7.669007778167725, 'step': 518},\n",
       "  {'loss': 7.676470756530762, 'step': 519},\n",
       "  {'loss': 7.546663761138916, 'step': 520},\n",
       "  {'loss': 7.8923749923706055, 'step': 521},\n",
       "  {'loss': 7.79856538772583, 'step': 522},\n",
       "  {'loss': 7.67686128616333, 'step': 523},\n",
       "  {'loss': 7.84279203414917, 'step': 524},\n",
       "  {'loss': 7.794217586517334, 'step': 525},\n",
       "  {'loss': 7.735276222229004, 'step': 526},\n",
       "  {'loss': 7.494115352630615, 'step': 527},\n",
       "  {'loss': 7.772193431854248, 'step': 528},\n",
       "  {'loss': 7.636438846588135, 'step': 529},\n",
       "  {'loss': 7.644656181335449, 'step': 530},\n",
       "  {'loss': 7.524884223937988, 'step': 531},\n",
       "  {'loss': 7.696950435638428, 'step': 532},\n",
       "  {'loss': 7.87467622756958, 'step': 533},\n",
       "  {'loss': 7.863544464111328, 'step': 534},\n",
       "  {'loss': 7.6578168869018555, 'step': 535},\n",
       "  {'loss': 7.919576644897461, 'step': 536},\n",
       "  {'loss': 7.82082986831665, 'step': 537},\n",
       "  {'loss': 7.710214138031006, 'step': 538},\n",
       "  {'loss': 7.426577091217041, 'step': 539},\n",
       "  {'loss': 7.921707630157471, 'step': 540},\n",
       "  {'loss': 7.710389614105225, 'step': 541},\n",
       "  {'loss': 7.709064483642578, 'step': 542},\n",
       "  {'loss': 7.591081619262695, 'step': 543},\n",
       "  {'loss': 7.742255210876465, 'step': 544},\n",
       "  {'loss': 7.611418724060059, 'step': 545},\n",
       "  {'loss': 7.442638874053955, 'step': 546},\n",
       "  {'loss': 7.444026947021484, 'step': 547},\n",
       "  {'loss': 7.716597080230713, 'step': 548},\n",
       "  {'loss': 7.729498863220215, 'step': 549},\n",
       "  {'loss': 7.395881175994873, 'step': 550},\n",
       "  {'loss': 7.5172553062438965, 'step': 551},\n",
       "  {'loss': 7.645167827606201, 'step': 552},\n",
       "  {'loss': 7.397112846374512, 'step': 553},\n",
       "  {'loss': 7.697885990142822, 'step': 554},\n",
       "  {'loss': 7.719954967498779, 'step': 555},\n",
       "  {'loss': 7.662437915802002, 'step': 556},\n",
       "  {'loss': 7.353125095367432, 'step': 557},\n",
       "  {'loss': 7.680455684661865, 'step': 558},\n",
       "  {'loss': 7.180401802062988, 'step': 559},\n",
       "  {'loss': 7.41989803314209, 'step': 560},\n",
       "  {'loss': 7.539623260498047, 'step': 561},\n",
       "  {'loss': 7.710124969482422, 'step': 562},\n",
       "  {'loss': 7.7498955726623535, 'step': 563},\n",
       "  {'loss': 7.862040042877197, 'step': 564},\n",
       "  {'loss': 7.757291793823242, 'step': 565},\n",
       "  {'loss': 7.457097053527832, 'step': 566},\n",
       "  {'loss': 7.750908374786377, 'step': 567},\n",
       "  {'loss': 7.57175874710083, 'step': 568},\n",
       "  {'loss': 7.334843158721924, 'step': 569},\n",
       "  {'loss': 7.470103740692139, 'step': 570},\n",
       "  {'loss': 7.299891471862793, 'step': 571},\n",
       "  {'loss': 7.620513439178467, 'step': 572},\n",
       "  {'loss': 7.6703057289123535, 'step': 573},\n",
       "  {'loss': 7.526971340179443, 'step': 574},\n",
       "  {'loss': 7.406712055206299, 'step': 575},\n",
       "  {'loss': 7.566614627838135, 'step': 576},\n",
       "  {'loss': 7.570528507232666, 'step': 577},\n",
       "  {'loss': 7.855157375335693, 'step': 578},\n",
       "  {'loss': 7.361448287963867, 'step': 579},\n",
       "  {'loss': 7.4479827880859375, 'step': 580},\n",
       "  {'loss': 7.508078098297119, 'step': 581},\n",
       "  {'loss': 7.149799823760986, 'step': 582},\n",
       "  {'loss': 7.3578057289123535, 'step': 583},\n",
       "  {'loss': 7.390666484832764, 'step': 584},\n",
       "  {'loss': 7.577052116394043, 'step': 585},\n",
       "  {'loss': 7.390568256378174, 'step': 586},\n",
       "  {'loss': 7.263892650604248, 'step': 587},\n",
       "  {'loss': 7.252124786376953, 'step': 588},\n",
       "  {'loss': 7.3082709312438965, 'step': 589},\n",
       "  {'loss': 7.55112361907959, 'step': 590},\n",
       "  {'loss': 7.6047492027282715, 'step': 591},\n",
       "  {'loss': 7.3826823234558105, 'step': 592},\n",
       "  {'loss': 7.5091657638549805, 'step': 593},\n",
       "  {'loss': 7.027590751647949, 'step': 594},\n",
       "  {'loss': 7.1952362060546875, 'step': 595},\n",
       "  {'loss': 7.2699809074401855, 'step': 596},\n",
       "  {'loss': 7.025395393371582, 'step': 597},\n",
       "  {'loss': 7.127758026123047, 'step': 598},\n",
       "  {'loss': 7.535139083862305, 'step': 599},\n",
       "  {'loss': 7.266581058502197, 'step': 600},\n",
       "  {'loss': 7.342980861663818, 'step': 601},\n",
       "  {'loss': 7.320620059967041, 'step': 602},\n",
       "  {'loss': 7.207773208618164, 'step': 603},\n",
       "  {'loss': 7.041051387786865, 'step': 604},\n",
       "  {'loss': 7.596545219421387, 'step': 605},\n",
       "  {'loss': 7.361767768859863, 'step': 606},\n",
       "  {'loss': 7.294073104858398, 'step': 607},\n",
       "  {'loss': 7.314830303192139, 'step': 608},\n",
       "  {'loss': 7.2310566902160645, 'step': 609},\n",
       "  {'loss': 7.564520359039307, 'step': 610},\n",
       "  {'loss': 6.934220790863037, 'step': 611},\n",
       "  {'loss': 7.152870178222656, 'step': 612},\n",
       "  {'loss': 7.399796009063721, 'step': 613},\n",
       "  {'loss': 7.419164180755615, 'step': 614},\n",
       "  {'loss': 7.502021312713623, 'step': 615},\n",
       "  {'loss': 7.114210605621338, 'step': 616},\n",
       "  {'loss': 7.174281597137451, 'step': 617},\n",
       "  {'loss': 7.486499309539795, 'step': 618},\n",
       "  {'loss': 7.070748329162598, 'step': 619},\n",
       "  {'loss': 7.403371334075928, 'step': 620},\n",
       "  {'loss': 7.345699787139893, 'step': 621},\n",
       "  {'loss': 7.202848434448242, 'step': 622},\n",
       "  {'loss': 7.207184314727783, 'step': 623},\n",
       "  {'loss': 7.129433631896973, 'step': 624},\n",
       "  {'loss': 7.158873558044434, 'step': 625},\n",
       "  {'loss': 7.170755386352539, 'step': 626},\n",
       "  {'loss': 7.4374308586120605, 'step': 627},\n",
       "  {'loss': 7.029956340789795, 'step': 628},\n",
       "  {'loss': 7.181494235992432, 'step': 629},\n",
       "  {'loss': 7.3888936042785645, 'step': 630},\n",
       "  {'loss': 7.1760945320129395, 'step': 631},\n",
       "  {'loss': 7.018945217132568, 'step': 632},\n",
       "  {'loss': 7.053317070007324, 'step': 633},\n",
       "  {'loss': 7.517484188079834, 'step': 634},\n",
       "  {'loss': 7.529534816741943, 'step': 635},\n",
       "  {'loss': 7.16817569732666, 'step': 636},\n",
       "  {'loss': 7.171300411224365, 'step': 637},\n",
       "  {'loss': 7.311634063720703, 'step': 638},\n",
       "  {'loss': 7.176807403564453, 'step': 639},\n",
       "  {'loss': 7.03646993637085, 'step': 640},\n",
       "  {'loss': 6.832799911499023, 'step': 641},\n",
       "  {'loss': 7.009039878845215, 'step': 642},\n",
       "  {'loss': 7.245894432067871, 'step': 643},\n",
       "  {'loss': 7.500192642211914, 'step': 644},\n",
       "  {'loss': 7.0765790939331055, 'step': 645},\n",
       "  {'loss': 7.331995010375977, 'step': 646},\n",
       "  {'loss': 6.934374809265137, 'step': 647},\n",
       "  {'loss': 7.1456685066223145, 'step': 648},\n",
       "  {'loss': 7.10111665725708, 'step': 649},\n",
       "  {'loss': 7.393423080444336, 'step': 650},\n",
       "  {'loss': 7.090003490447998, 'step': 651},\n",
       "  {'loss': 7.042051792144775, 'step': 652},\n",
       "  {'loss': 7.030915260314941, 'step': 653},\n",
       "  {'loss': 7.1856184005737305, 'step': 654},\n",
       "  {'loss': 7.098593711853027, 'step': 655},\n",
       "  {'loss': 7.059091091156006, 'step': 656},\n",
       "  {'loss': 6.923255443572998, 'step': 657},\n",
       "  {'loss': 7.443150520324707, 'step': 658},\n",
       "  {'loss': 7.0261454582214355, 'step': 659},\n",
       "  {'loss': 6.906043529510498, 'step': 660},\n",
       "  {'loss': 7.14348840713501, 'step': 661},\n",
       "  {'loss': 7.275765895843506, 'step': 662},\n",
       "  {'loss': 7.043351173400879, 'step': 663},\n",
       "  {'loss': 7.361514568328857, 'step': 664},\n",
       "  {'loss': 6.933983325958252, 'step': 665},\n",
       "  {'loss': 7.181207180023193, 'step': 666},\n",
       "  {'loss': 7.437530994415283, 'step': 667},\n",
       "  {'loss': 6.764682292938232, 'step': 668},\n",
       "  {'loss': 6.7830095291137695, 'step': 669},\n",
       "  {'loss': 6.997376918792725, 'step': 670},\n",
       "  {'loss': 6.791358947753906, 'step': 671},\n",
       "  {'loss': 7.182219505310059, 'step': 672},\n",
       "  {'loss': 7.35410213470459, 'step': 673},\n",
       "  {'loss': 7.15557336807251, 'step': 674},\n",
       "  {'loss': 7.215465545654297, 'step': 675},\n",
       "  {'loss': 6.870040416717529, 'step': 676},\n",
       "  {'loss': 6.959062576293945, 'step': 677},\n",
       "  {'loss': 7.128637313842773, 'step': 678},\n",
       "  {'loss': 7.052062511444092, 'step': 679},\n",
       "  {'loss': 6.759189605712891, 'step': 680},\n",
       "  {'loss': 6.807889938354492, 'step': 681},\n",
       "  {'loss': 7.162138938903809, 'step': 682},\n",
       "  {'loss': 7.155221939086914, 'step': 683},\n",
       "  {'loss': 7.023264408111572, 'step': 684},\n",
       "  {'loss': 6.743532180786133, 'step': 685},\n",
       "  {'loss': 7.19226598739624, 'step': 686},\n",
       "  {'loss': 7.044374942779541, 'step': 687},\n",
       "  {'loss': 6.749134063720703, 'step': 688},\n",
       "  {'loss': 7.2438645362854, 'step': 689},\n",
       "  {'loss': 7.120786666870117, 'step': 690},\n",
       "  {'loss': 6.825073719024658, 'step': 691},\n",
       "  {'loss': 6.939908504486084, 'step': 692},\n",
       "  {'loss': 6.883171081542969, 'step': 693},\n",
       "  {'loss': 6.931825637817383, 'step': 694},\n",
       "  {'loss': 6.870404243469238, 'step': 695},\n",
       "  {'loss': 6.949552059173584, 'step': 696},\n",
       "  {'loss': 7.1713972091674805, 'step': 697},\n",
       "  {'loss': 6.7010908126831055, 'step': 698},\n",
       "  {'loss': 6.818287372589111, 'step': 699},\n",
       "  {'loss': 6.832795143127441, 'step': 700},\n",
       "  {'loss': 6.957871437072754, 'step': 701},\n",
       "  {'loss': 7.181402683258057, 'step': 702},\n",
       "  {'loss': 6.697563648223877, 'step': 703},\n",
       "  {'loss': 6.7007155418396, 'step': 704},\n",
       "  {'loss': 7.177259922027588, 'step': 705},\n",
       "  {'loss': 6.839569091796875, 'step': 706},\n",
       "  {'loss': 6.885136604309082, 'step': 707},\n",
       "  {'loss': 6.9797258377075195, 'step': 708},\n",
       "  {'loss': 7.0752482414245605, 'step': 709},\n",
       "  {'loss': 6.779252052307129, 'step': 710},\n",
       "  {'loss': 6.716274261474609, 'step': 711},\n",
       "  {'loss': 6.707607269287109, 'step': 712},\n",
       "  {'loss': 6.927063465118408, 'step': 713},\n",
       "  {'loss': 6.819830417633057, 'step': 714},\n",
       "  {'loss': 6.851888656616211, 'step': 715},\n",
       "  {'loss': 6.7257914543151855, 'step': 716},\n",
       "  {'loss': 7.1635332107543945, 'step': 717},\n",
       "  {'loss': 7.029119968414307, 'step': 718},\n",
       "  {'loss': 6.751287937164307, 'step': 719},\n",
       "  {'loss': 6.731037616729736, 'step': 720},\n",
       "  {'loss': 7.162548065185547, 'step': 721},\n",
       "  {'loss': 6.801044464111328, 'step': 722},\n",
       "  {'loss': 6.5490827560424805, 'step': 723},\n",
       "  {'loss': 6.801702976226807, 'step': 724},\n",
       "  {'loss': 7.019017696380615, 'step': 725},\n",
       "  {'loss': 6.838452339172363, 'step': 726},\n",
       "  {'loss': 7.023163795471191, 'step': 727},\n",
       "  {'loss': 6.768173694610596, 'step': 728},\n",
       "  {'loss': 6.988365173339844, 'step': 729},\n",
       "  {'loss': 6.734734535217285, 'step': 730},\n",
       "  {'loss': 7.170915126800537, 'step': 731},\n",
       "  {'loss': 6.528775691986084, 'step': 732},\n",
       "  {'loss': 6.841830253601074, 'step': 733},\n",
       "  {'loss': 6.660566329956055, 'step': 734},\n",
       "  {'loss': 6.7556376457214355, 'step': 735},\n",
       "  {'loss': 6.984865188598633, 'step': 736},\n",
       "  {'loss': 6.908511161804199, 'step': 737},\n",
       "  {'loss': 6.936150550842285, 'step': 738},\n",
       "  {'loss': 6.910303592681885, 'step': 739},\n",
       "  {'loss': 6.73919677734375, 'step': 740},\n",
       "  {'loss': 6.68440580368042, 'step': 741},\n",
       "  {'loss': 6.769603729248047, 'step': 742},\n",
       "  {'loss': 7.0633158683776855, 'step': 743},\n",
       "  {'loss': 6.595346450805664, 'step': 744},\n",
       "  {'loss': 6.844175815582275, 'step': 745},\n",
       "  {'loss': 6.831394672393799, 'step': 746},\n",
       "  {'loss': 6.9170451164245605, 'step': 747},\n",
       "  {'loss': 6.777713775634766, 'step': 748},\n",
       "  {'loss': 6.559439659118652, 'step': 749},\n",
       "  {'loss': 6.749660491943359, 'step': 750},\n",
       "  {'loss': 6.395197868347168, 'step': 751},\n",
       "  {'loss': 6.283380031585693, 'step': 752},\n",
       "  {'loss': 6.774031639099121, 'step': 753},\n",
       "  {'loss': 6.595574855804443, 'step': 754},\n",
       "  {'loss': 6.557584285736084, 'step': 755},\n",
       "  {'loss': 6.338308811187744, 'step': 756},\n",
       "  {'loss': 6.865995407104492, 'step': 757},\n",
       "  {'loss': 7.080412864685059, 'step': 758},\n",
       "  {'loss': 7.0657124519348145, 'step': 759},\n",
       "  {'loss': 6.379541873931885, 'step': 760},\n",
       "  {'loss': 6.736809730529785, 'step': 761},\n",
       "  {'loss': 6.548588752746582, 'step': 762},\n",
       "  {'loss': 6.928490161895752, 'step': 763},\n",
       "  {'loss': 6.654918193817139, 'step': 764},\n",
       "  {'loss': 6.646399021148682, 'step': 765},\n",
       "  {'loss': 6.8407464027404785, 'step': 766},\n",
       "  {'loss': 6.776972770690918, 'step': 767},\n",
       "  {'loss': 6.603433132171631, 'step': 768},\n",
       "  {'loss': 6.3820037841796875, 'step': 769},\n",
       "  {'loss': 6.895803928375244, 'step': 770},\n",
       "  {'loss': 6.5973358154296875, 'step': 771},\n",
       "  {'loss': 6.406151294708252, 'step': 772},\n",
       "  {'loss': 6.639079570770264, 'step': 773},\n",
       "  {'loss': 6.980778694152832, 'step': 774},\n",
       "  {'loss': 6.237178325653076, 'step': 775},\n",
       "  {'loss': 7.031957626342773, 'step': 776},\n",
       "  {'loss': 6.8956708908081055, 'step': 777},\n",
       "  {'loss': 6.532357692718506, 'step': 778},\n",
       "  {'loss': 6.864582061767578, 'step': 779},\n",
       "  {'loss': 6.442318916320801, 'step': 780},\n",
       "  {'loss': 6.602043628692627, 'step': 781},\n",
       "  {'loss': 6.412537574768066, 'step': 782},\n",
       "  {'loss': 6.48628044128418, 'step': 783},\n",
       "  {'loss': 6.883584022521973, 'step': 784},\n",
       "  {'loss': 6.48097038269043, 'step': 785},\n",
       "  {'loss': 6.4838786125183105, 'step': 786},\n",
       "  {'loss': 6.6199727058410645, 'step': 787},\n",
       "  {'loss': 6.7455668449401855, 'step': 788},\n",
       "  {'loss': 6.188955307006836, 'step': 789},\n",
       "  {'loss': 6.669046878814697, 'step': 790},\n",
       "  {'loss': 6.292086124420166, 'step': 791},\n",
       "  {'loss': 6.5485005378723145, 'step': 792},\n",
       "  {'loss': 6.343299865722656, 'step': 793},\n",
       "  {'loss': 6.165092468261719, 'step': 794},\n",
       "  {'loss': 6.566962718963623, 'step': 795},\n",
       "  {'loss': 6.521857738494873, 'step': 796},\n",
       "  {'loss': 6.343181610107422, 'step': 797},\n",
       "  {'loss': 6.177907943725586, 'step': 798},\n",
       "  {'loss': 6.4117865562438965, 'step': 799},\n",
       "  {'loss': 6.706396579742432, 'step': 800},\n",
       "  {'loss': 6.257040023803711, 'step': 801},\n",
       "  {'loss': 6.430344104766846, 'step': 802},\n",
       "  {'loss': 6.114831447601318, 'step': 803},\n",
       "  {'loss': 6.356044292449951, 'step': 804},\n",
       "  {'loss': 6.330626010894775, 'step': 805},\n",
       "  {'loss': 6.285500526428223, 'step': 806},\n",
       "  {'loss': 6.63280725479126, 'step': 807},\n",
       "  {'loss': 6.583584308624268, 'step': 808},\n",
       "  {'loss': 6.714691638946533, 'step': 809},\n",
       "  {'loss': 6.179358005523682, 'step': 810},\n",
       "  {'loss': 6.363171100616455, 'step': 811},\n",
       "  {'loss': 6.35966682434082, 'step': 812},\n",
       "  {'loss': 6.628190517425537, 'step': 813},\n",
       "  {'loss': 6.567152976989746, 'step': 814},\n",
       "  {'loss': 6.554537773132324, 'step': 815},\n",
       "  {'loss': 6.190966606140137, 'step': 816},\n",
       "  {'loss': 6.39531135559082, 'step': 817},\n",
       "  {'loss': 6.598514080047607, 'step': 818},\n",
       "  {'loss': 6.498017311096191, 'step': 819},\n",
       "  {'loss': 6.260854721069336, 'step': 820},\n",
       "  {'loss': 6.293556213378906, 'step': 821},\n",
       "  {'loss': 6.926159858703613, 'step': 822},\n",
       "  {'loss': 6.5915398597717285, 'step': 823},\n",
       "  {'loss': 6.453945636749268, 'step': 824},\n",
       "  {'loss': 6.279854774475098, 'step': 825},\n",
       "  {'loss': 6.6998090744018555, 'step': 826},\n",
       "  {'loss': 6.289638042449951, 'step': 827},\n",
       "  {'loss': 5.937112808227539, 'step': 828},\n",
       "  {'loss': 6.452803134918213, 'step': 829},\n",
       "  {'loss': 6.326229572296143, 'step': 830},\n",
       "  {'loss': 6.355530738830566, 'step': 831},\n",
       "  {'loss': 6.500544548034668, 'step': 832},\n",
       "  {'loss': 6.261881351470947, 'step': 833},\n",
       "  {'loss': 6.234697341918945, 'step': 834},\n",
       "  {'loss': 6.190271377563477, 'step': 835},\n",
       "  {'loss': 6.6414899826049805, 'step': 836},\n",
       "  {'loss': 6.14676570892334, 'step': 837},\n",
       "  {'loss': 6.337790012359619, 'step': 838},\n",
       "  {'loss': 6.419117450714111, 'step': 839},\n",
       "  {'loss': 5.968561172485352, 'step': 840},\n",
       "  {'loss': 6.471798419952393, 'step': 841},\n",
       "  {'loss': 6.5181450843811035, 'step': 842},\n",
       "  {'loss': 6.28688907623291, 'step': 843},\n",
       "  {'loss': 6.417386531829834, 'step': 844},\n",
       "  {'loss': 6.503942012786865, 'step': 845},\n",
       "  {'loss': 6.230679035186768, 'step': 846},\n",
       "  {'loss': 6.1722893714904785, 'step': 847},\n",
       "  {'loss': 6.220085144042969, 'step': 848},\n",
       "  {'loss': 5.959766387939453, 'step': 849},\n",
       "  {'loss': 6.0390801429748535, 'step': 850},\n",
       "  {'loss': 5.911836624145508, 'step': 851},\n",
       "  {'loss': 6.257176399230957, 'step': 852},\n",
       "  {'loss': 6.5651774406433105, 'step': 853},\n",
       "  {'loss': 6.385879993438721, 'step': 854},\n",
       "  {'loss': 6.450270175933838, 'step': 855},\n",
       "  {'loss': 6.313591957092285, 'step': 856},\n",
       "  {'loss': 6.411888599395752, 'step': 857},\n",
       "  {'loss': 6.210583209991455, 'step': 858},\n",
       "  {'loss': 6.529592990875244, 'step': 859},\n",
       "  {'loss': 6.369550704956055, 'step': 860},\n",
       "  {'loss': 6.4007887840271, 'step': 861},\n",
       "  {'loss': 6.494715213775635, 'step': 862},\n",
       "  {'loss': 6.373659133911133, 'step': 863},\n",
       "  {'loss': 6.408352851867676, 'step': 864},\n",
       "  {'loss': 6.3008131980896, 'step': 865},\n",
       "  {'loss': 5.812088489532471, 'step': 866},\n",
       "  {'loss': 6.265524387359619, 'step': 867},\n",
       "  {'loss': 6.562970161437988, 'step': 868},\n",
       "  {'loss': 6.066633224487305, 'step': 869},\n",
       "  {'loss': 6.306242942810059, 'step': 870},\n",
       "  {'loss': 6.441574573516846, 'step': 871},\n",
       "  {'loss': 6.4696574211120605, 'step': 872},\n",
       "  {'loss': 6.33687162399292, 'step': 873},\n",
       "  {'loss': 6.407077312469482, 'step': 874},\n",
       "  {'loss': 6.070101737976074, 'step': 875},\n",
       "  {'loss': 6.387304782867432, 'step': 876},\n",
       "  {'loss': 6.151233196258545, 'step': 877},\n",
       "  {'loss': 6.313432693481445, 'step': 878},\n",
       "  {'loss': 6.542815208435059, 'step': 879},\n",
       "  {'loss': 6.04337215423584, 'step': 880},\n",
       "  {'loss': 5.9234466552734375, 'step': 881},\n",
       "  {'loss': 5.977806091308594, 'step': 882},\n",
       "  {'loss': 6.138620853424072, 'step': 883},\n",
       "  {'loss': 6.716285228729248, 'step': 884},\n",
       "  {'loss': 6.384158611297607, 'step': 885},\n",
       "  {'loss': 5.998964786529541, 'step': 886},\n",
       "  {'loss': 6.809689044952393, 'step': 887},\n",
       "  {'loss': 6.288666248321533, 'step': 888},\n",
       "  {'loss': 6.593020915985107, 'step': 889},\n",
       "  {'loss': 6.03680944442749, 'step': 890},\n",
       "  {'loss': 6.159307956695557, 'step': 891},\n",
       "  {'loss': 6.100512981414795, 'step': 892},\n",
       "  {'loss': 5.737307071685791, 'step': 893},\n",
       "  {'loss': 6.299551963806152, 'step': 894},\n",
       "  {'loss': 6.302634239196777, 'step': 895},\n",
       "  {'loss': 6.2369160652160645, 'step': 896},\n",
       "  {'loss': 6.207399368286133, 'step': 897},\n",
       "  {'loss': 6.215152740478516, 'step': 898},\n",
       "  {'loss': 6.071704864501953, 'step': 899},\n",
       "  {'loss': 5.931097984313965, 'step': 900},\n",
       "  {'loss': 6.27244758605957, 'step': 901},\n",
       "  {'loss': 6.016834259033203, 'step': 902},\n",
       "  {'loss': 6.380876064300537, 'step': 903},\n",
       "  {'loss': 6.175624847412109, 'step': 904},\n",
       "  {'loss': 6.436741352081299, 'step': 905},\n",
       "  {'loss': 6.429952144622803, 'step': 906},\n",
       "  {'loss': 6.6877217292785645, 'step': 907},\n",
       "  {'loss': 5.965764999389648, 'step': 908},\n",
       "  {'loss': 6.369814872741699, 'step': 909},\n",
       "  {'loss': 6.061135768890381, 'step': 910},\n",
       "  {'loss': 6.007413387298584, 'step': 911},\n",
       "  {'loss': 6.069154739379883, 'step': 912},\n",
       "  {'loss': 6.010270595550537, 'step': 913},\n",
       "  {'loss': 6.51787805557251, 'step': 914},\n",
       "  {'loss': 6.3791985511779785, 'step': 915},\n",
       "  {'loss': 6.288445949554443, 'step': 916},\n",
       "  {'loss': 6.1061506271362305, 'step': 917},\n",
       "  {'loss': 5.97265625, 'step': 918},\n",
       "  {'loss': 6.310885429382324, 'step': 919},\n",
       "  {'loss': 6.250307559967041, 'step': 920},\n",
       "  {'loss': 6.105425834655762, 'step': 921},\n",
       "  {'loss': 5.978694915771484, 'step': 922},\n",
       "  {'loss': 6.142204761505127, 'step': 923},\n",
       "  {'loss': 6.331058502197266, 'step': 924},\n",
       "  {'loss': 6.293662071228027, 'step': 925},\n",
       "  {'loss': 5.929217338562012, 'step': 926},\n",
       "  {'loss': 5.88723611831665, 'step': 927},\n",
       "  {'loss': 6.172686576843262, 'step': 928},\n",
       "  {'loss': 5.867580890655518, 'step': 929},\n",
       "  {'loss': 6.30661678314209, 'step': 930},\n",
       "  {'loss': 5.738911151885986, 'step': 931},\n",
       "  {'loss': 6.543247699737549, 'step': 932},\n",
       "  {'loss': 5.781501293182373, 'step': 933},\n",
       "  {'loss': 6.293636798858643, 'step': 934},\n",
       "  {'loss': 6.384586811065674, 'step': 935},\n",
       "  {'loss': 6.282784461975098, 'step': 936},\n",
       "  {'loss': 6.170432090759277, 'step': 937},\n",
       "  {'loss': 6.55490255355835, 'step': 938},\n",
       "  {'loss': 6.367795467376709, 'step': 939},\n",
       "  {'loss': 6.24062967300415, 'step': 940},\n",
       "  {'loss': 6.229131698608398, 'step': 941},\n",
       "  {'loss': 6.35992431640625, 'step': 942},\n",
       "  {'loss': 6.495304107666016, 'step': 943},\n",
       "  {'loss': 5.975971698760986, 'step': 944},\n",
       "  {'loss': 6.028828144073486, 'step': 945},\n",
       "  {'loss': 6.0032429695129395, 'step': 946},\n",
       "  {'loss': 6.204649925231934, 'step': 947},\n",
       "  {'loss': 5.785129547119141, 'step': 948},\n",
       "  {'loss': 6.505818843841553, 'step': 949},\n",
       "  {'loss': 5.772528171539307, 'step': 950},\n",
       "  {'loss': 5.735979080200195, 'step': 951},\n",
       "  {'loss': 5.937489032745361, 'step': 952},\n",
       "  {'loss': 6.424741268157959, 'step': 953},\n",
       "  {'loss': 6.310524940490723, 'step': 954},\n",
       "  {'loss': 5.926977634429932, 'step': 955},\n",
       "  {'loss': 6.261716842651367, 'step': 956},\n",
       "  {'loss': 6.094671249389648, 'step': 957},\n",
       "  {'loss': 6.15338134765625, 'step': 958},\n",
       "  {'loss': 6.19827127456665, 'step': 959},\n",
       "  {'loss': 6.186023712158203, 'step': 960},\n",
       "  {'loss': 5.9159393310546875, 'step': 961},\n",
       "  {'loss': 6.123536109924316, 'step': 962},\n",
       "  {'loss': 6.2494282722473145, 'step': 963},\n",
       "  {'loss': 5.692707538604736, 'step': 964},\n",
       "  {'loss': 6.103891372680664, 'step': 965},\n",
       "  {'loss': 5.9879608154296875, 'step': 966},\n",
       "  {'loss': 5.9244842529296875, 'step': 967},\n",
       "  {'loss': 5.878964424133301, 'step': 968},\n",
       "  {'loss': 6.039251804351807, 'step': 969},\n",
       "  {'loss': 6.241943359375, 'step': 970},\n",
       "  {'loss': 6.2395710945129395, 'step': 971},\n",
       "  {'loss': 6.520854949951172, 'step': 972},\n",
       "  {'loss': 5.802354335784912, 'step': 973},\n",
       "  {'loss': 6.233215808868408, 'step': 974},\n",
       "  {'loss': 5.4209065437316895, 'step': 975},\n",
       "  {'loss': 5.964983940124512, 'step': 976},\n",
       "  {'loss': 6.135168552398682, 'step': 977},\n",
       "  {'loss': 6.04783296585083, 'step': 978},\n",
       "  {'loss': 6.376293659210205, 'step': 979},\n",
       "  {'loss': 5.676102638244629, 'step': 980},\n",
       "  {'loss': 6.145635604858398, 'step': 981},\n",
       "  {'loss': 5.676402568817139, 'step': 982},\n",
       "  {'loss': 5.6327338218688965, 'step': 983},\n",
       "  {'loss': 5.707225322723389, 'step': 984},\n",
       "  {'loss': 5.921937942504883, 'step': 985},\n",
       "  {'loss': 5.947057247161865, 'step': 986},\n",
       "  {'loss': 5.821903705596924, 'step': 987},\n",
       "  {'loss': 5.524294853210449, 'step': 988},\n",
       "  {'loss': 6.312183856964111, 'step': 989},\n",
       "  {'loss': 6.163697719573975, 'step': 990},\n",
       "  {'loss': 6.109326362609863, 'step': 991},\n",
       "  {'loss': 5.76170015335083, 'step': 992},\n",
       "  {'loss': 6.283783435821533, 'step': 993},\n",
       "  {'loss': 5.534055709838867, 'step': 994},\n",
       "  {'loss': 6.12209939956665, 'step': 995},\n",
       "  {'loss': 5.7092437744140625, 'step': 996},\n",
       "  {'loss': 5.8127665519714355, 'step': 997},\n",
       "  {'loss': 6.009891033172607, 'step': 998},\n",
       "  {'loss': 6.224247455596924, 'step': 999},\n",
       "  {'loss': 6.013883113861084, 'step': 1000},\n",
       "  ...],\n",
       " 'val': [{'loss': 7.818669092655182, 'step': 500},\n",
       "  {'loss': 5.9927087187767025, 'step': 1000},\n",
       "  {'loss': 5.65388023853302, 'step': 1500},\n",
       "  {'loss': 5.260864520072937, 'step': 2000},\n",
       "  {'loss': 4.970925569534302, 'step': 2500},\n",
       "  {'loss': 4.829624629020691, 'step': 3000},\n",
       "  {'loss': 4.689929509162903, 'step': 3500},\n",
       "  {'loss': 4.5247754693031315, 'step': 4000},\n",
       "  {'loss': 4.440172785520554, 'step': 4500},\n",
       "  {'loss': 4.349347800016403, 'step': 5000},\n",
       "  {'loss': 4.259123539924621, 'step': 5500},\n",
       "  {'loss': 4.191014641523362, 'step': 6000},\n",
       "  {'loss': 4.132670199871063, 'step': 6500},\n",
       "  {'loss': 4.083257502317428, 'step': 7000},\n",
       "  {'loss': 4.045688062906265, 'step': 7500},\n",
       "  {'loss': 3.9862859547138214, 'step': 8000},\n",
       "  {'loss': 3.9538683116436006, 'step': 8500},\n",
       "  {'loss': 3.9228647530078886, 'step': 9000},\n",
       "  {'loss': 3.881876653432846, 'step': 9500},\n",
       "  {'loss': 3.857376182079315, 'step': 10000},\n",
       "  {'loss': 3.8194287061691283, 'step': 10500},\n",
       "  {'loss': 3.792217916250229, 'step': 11000},\n",
       "  {'loss': 3.7746330916881563, 'step': 11500},\n",
       "  {'loss': 3.755358302593231, 'step': 12000},\n",
       "  {'loss': 3.717432677745819, 'step': 12500},\n",
       "  {'loss': 3.7094191014766693, 'step': 13000},\n",
       "  {'loss': 3.689199376106262, 'step': 13500},\n",
       "  {'loss': 3.686889481544495, 'step': 14000},\n",
       "  {'loss': 3.6494507014751436, 'step': 14500},\n",
       "  {'loss': 3.642803543806076, 'step': 15000},\n",
       "  {'loss': 3.6325750648975372, 'step': 15500},\n",
       "  {'loss': 3.6060924232006073, 'step': 16000},\n",
       "  {'loss': 3.6122376203536986, 'step': 16500},\n",
       "  {'loss': 3.5847187757492067, 'step': 17000},\n",
       "  {'loss': 3.5700687408447265, 'step': 17500},\n",
       "  {'loss': 3.5673757433891295, 'step': 18000},\n",
       "  {'loss': 3.559729754924774, 'step': 18500},\n",
       "  {'loss': 3.544168210029602, 'step': 19000},\n",
       "  {'loss': 3.529229336977005, 'step': 19500},\n",
       "  {'loss': 3.5252376317977907, 'step': 20000},\n",
       "  {'loss': 3.5171762108802795, 'step': 20500},\n",
       "  {'loss': 3.5071077048778534, 'step': 21000},\n",
       "  {'loss': 3.506646382808685, 'step': 21500},\n",
       "  {'loss': 3.4909452497959137, 'step': 22000},\n",
       "  {'loss': 3.4972014844417574, 'step': 22500},\n",
       "  {'loss': 3.480539482831955, 'step': 23000},\n",
       "  {'loss': 3.4865103721618653, 'step': 23500},\n",
       "  {'loss': 3.477023792266846, 'step': 24000},\n",
       "  {'loss': 3.484994775056839, 'step': 24500},\n",
       "  {'loss': 3.457285702228546, 'step': 25000},\n",
       "  {'loss': 3.471253311634064, 'step': 25500},\n",
       "  {'loss': 3.4594983398914336, 'step': 26000},\n",
       "  {'loss': 3.461526966094971, 'step': 26500},\n",
       "  {'loss': 3.4512669444084167, 'step': 27000},\n",
       "  {'loss': 3.4501972079277037, 'step': 27500},\n",
       "  {'loss': 3.457464265823364, 'step': 28000},\n",
       "  {'loss': 3.452886861562729, 'step': 28500},\n",
       "  {'loss': 3.4435614109039308, 'step': 29000},\n",
       "  {'loss': 3.442809873819351, 'step': 29500},\n",
       "  {'loss': 3.443920338153839, 'step': 30000},\n",
       "  {'loss': 3.4524885416030884, 'step': 30500},\n",
       "  {'loss': 3.449502396583557, 'step': 31000},\n",
       "  {'loss': 3.444110316038132, 'step': 31500},\n",
       "  {'loss': 3.453917348384857, 'step': 32000},\n",
       "  {'loss': 3.4338973641395567, 'step': 32500},\n",
       "  {'loss': 3.442009437084198, 'step': 33000},\n",
       "  {'loss': 3.4359843611717222, 'step': 33500},\n",
       "  {'loss': 3.4376285791397097, 'step': 34000}]}"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rTjbeFlIN4yZ"
   },
   "source": [
    "## 推理\n",
    "\n",
    "- 翻译项目的评估指标一般是BLEU4，感兴趣的同学自行了解并实现\n",
    "- 接下来进行翻译推理，并作出注意力的热度图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:34.161868Z",
     "iopub.status.busy": "2025-02-07T04:56:34.161285Z",
     "iopub.status.idle": "2025-02-07T04:56:43.285523Z",
     "shell.execute_reply": "2025-02-07T04:56:43.284883Z",
     "shell.execute_reply.started": "2025-02-07T04:56:34.161839Z"
    },
    "id": "WxsjkyQgN4yZ",
    "outputId": "5ce160c2-ce7e-4bc3-d2b6-a332c7fcf6a1",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: Cython in /usr/local/lib/python3.10/site-packages (3.0.11)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n",
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: fastBPE in /usr/local/lib/python3.10/site-packages (0.1.0)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install Cython  # if failed to install fastBPE, try this line\n",
    "!pip install fastBPE #分词使用\n",
    "# 在 Windows 系统上并没有 sys/mman.h 文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:41:23.050407Z",
     "iopub.status.busy": "2025-02-07T04:41:23.050031Z",
     "iopub.status.idle": "2025-02-07T04:41:23.054570Z",
     "shell.execute_reply": "2025-02-07T04:41:23.054004Z",
     "shell.execute_reply.started": "2025-02-07T04:41:23.050381Z"
    },
    "id": "f6Ry1PcAn4k1",
    "outputId": "6393524e-e5c3-4f93-dd9d-f249ca52bc05",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'translate-transformer-not-share'"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "exp_name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:47.781979Z",
     "iopub.status.busy": "2025-02-07T04:56:47.781571Z",
     "iopub.status.idle": "2025-02-07T04:56:47.909839Z",
     "shell.execute_reply": "2025-02-07T04:56:47.909237Z",
     "shell.execute_reply.started": "2025-02-07T04:56:47.781952Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总计 281580\n",
      "-rw-r--r-- 1 root root 288336196  2月  6 18:38 best.ckpt\n"
     ]
    }
   ],
   "source": [
    "ls checkpoints/translate-transformer-not-share -l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:32.326542400Z",
     "start_time": "2024-08-05T03:10:31.006376300Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:55.175413Z",
     "iopub.status.busy": "2025-02-07T04:56:55.175032Z",
     "iopub.status.idle": "2025-02-07T04:56:55.303142Z",
     "shell.execute_reply": "2025-02-07T04:56:55.302578Z",
     "shell.execute_reply.started": "2025-02-07T04:56:55.175387Z"
    },
    "id": "jT1Mqiq3N4yZ",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_958/1906663989.py:3: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=\"cpu\")\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=\"cpu\")\n",
    "\n",
    "# state_dict1 = torch.load(\"epoch125-step132426.ckpt\", map_location=\"cpu\")\n",
    "# state_dict = state_dict1[\"state_dict\"]\n",
    "\n",
    "# update keys by dropping `model`\n",
    "# for key in list(state_dict):\n",
    "#     state_dict[key.replace(\"model.\", \"\")] = state_dict.pop(key)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:46.720508800Z",
     "start_time": "2024-08-05T03:10:36.179313900Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:56:58.656110Z",
     "iopub.status.busy": "2025-02-07T04:56:58.655742Z",
     "iopub.status.idle": "2025-02-07T04:57:03.176630Z",
     "shell.execute_reply": "2025-02-07T04:57:03.175964Z",
     "shell.execute_reply.started": "2025-02-07T04:56:58.656086Z"
    },
    "id": "eKwIDdjgvTlO",
    "outputId": "35979ff2-a16d-4aa4-881a-8496e39e2469",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: nltk in /usr/local/lib/python3.10/site-packages (3.9.1)\n",
      "Requirement already satisfied: click in /usr/local/lib/python3.10/site-packages (from nltk) (8.1.8)\n",
      "Requirement already satisfied: joblib in /usr/local/lib/python3.10/site-packages (from nltk) (1.4.2)\n",
      "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.10/site-packages (from nltk) (2024.11.6)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from nltk) (4.67.1)\n",
      "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
      "\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install nltk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "id": "WVksjIhL_pt9",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# !rm -r wmt16/.cache"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:44:03.209214Z",
     "iopub.status.busy": "2025-02-07T04:44:03.208834Z",
     "iopub.status.idle": "2025-02-07T04:44:03.213890Z",
     "shell.execute_reply": "2025-02-07T04:44:03.213287Z",
     "shell.execute_reply.started": "2025-02-07T04:44:03.209189Z"
    },
    "id": "2MY69-6WWSjp",
    "outputId": "911d9066-7917-4917-b5cc-d679a1c63865",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['a man in an seinem hat sh-@@ at guitar .']"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode([[   5,   16,    6,   23,  150,   80, 8248,   35,  232,    4,    3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 101,
     "referenced_widgets": [
      "c9db4cd83b7b4f53a0fa93b8c365debd",
      "a972aba7913b48c6973ae27bff5b9d1d",
      "22aa774ab39e4fd78b0ff08d430d2b5d",
      "9a01f02fb99b4b81ac487d23bc5daf4a",
      "19f846338f6b48c9930b58575641e5b8",
      "7d293204dc1b4d97bb5ee670787c7b7d",
      "ea8fa440f320435aa75c9bef75bc3f08",
      "4e64bcb87e584beda0408a0aa5a659ae",
      "b077d7562d814df5b6d839464dd4122f",
      "5a28babf4e2e4393bdc1a093034885ab",
      "be07d518c21149d196c610fd57b1eaec"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:21:48.561541Z",
     "iopub.status.busy": "2025-02-07T05:21:48.561168Z",
     "iopub.status.idle": "2025-02-07T05:22:00.030848Z",
     "shell.execute_reply": "2025-02-07T05:22:00.030311Z",
     "shell.execute_reply.started": "2025-02-07T05:21:48.561516Z"
    },
    "id": "5QgodlOJfgKj",
    "outputId": "2907bad2-7cb1-4295-c8b0-77ac0dabf398",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load test dataset from wmt16/.cache/de2en_test_128.npy\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "0it [00:00, ?it/s]/usr/local/lib/python3.10/site-packages/torch/nn/_reduction.py:51: UserWarning: size_average and reduce args will be deprecated, please use reduction='none' instead.\n",
      "  warnings.warn(warning.format(ret))\n",
      "/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 4-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "1it [00:00,  7.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 3-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "21it [00:00, 71.60it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25, 26]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 2-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "41it [00:00, 85.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "61it [00:00, 90.64it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "81it [00:00, 93.04it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "91it [00:01, 93.62it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "101it [00:01, 93.99it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "111it [00:01, 94.01it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "121it [00:01, 94.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "131it [00:01, 94.29it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "141it [00:01, 94.23it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "151it [00:01, 94.40it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "161it [00:01, 94.43it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "171it [00:01, 94.73it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "181it [00:02, 94.55it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "191it [00:02, 94.78it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "201it [00:02, 95.00it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "211it [00:02, 95.09it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "221it [00:02, 94.79it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "231it [00:02, 94.57it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "241it [00:02, 93.50it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "251it [00:02, 93.97it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "261it [00:02, 94.37it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "271it [00:02, 94.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "291it [00:03, 94.97it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "311it [00:03, 95.27it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "331it [00:03, 95.68it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "351it [00:03, 95.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "371it [00:04, 95.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "391it [00:04, 95.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "401it [00:04, 95.64it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "411it [00:04, 95.87it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "421it [00:04, 94.72it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "431it [00:04, 94.51it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "441it [00:04, 94.90it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "451it [00:04, 95.11it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "461it [00:04, 94.95it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "471it [00:05, 95.02it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "481it [00:05, 94.38it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "491it [00:05, 94.74it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:05, 94.92it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "511it [00:05, 95.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "521it [00:05, 95.18it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "531it [00:05, 94.82it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "541it [00:05, 95.07it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "551it [00:05, 94.77it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "561it [00:06, 93.85it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "571it [00:06, 93.70it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "581it [00:06, 94.80it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "601it [00:06, 95.77it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "621it [00:06, 96.19it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "641it [00:06, 96.60it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "661it [00:07, 96.57it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "681it [00:07, 96.84it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "701it [00:07, 96.86it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "721it [00:07, 96.80it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "741it [00:07, 96.71it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "761it [00:08, 96.37it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "781it [00:08, 94.12it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "801it [00:08, 94.53it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "811it [00:08, 92.69it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "821it [00:08, 90.64it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "831it [00:08, 91.46it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "841it [00:08, 92.26it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "851it [00:09, 92.73it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "861it [00:09, 93.00it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "871it [00:09, 93.02it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "881it [00:09, 92.77it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "891it [00:09, 91.05it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23, 24, 25, 26]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "901it [00:09, 91.32it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "911it [00:09, 92.06it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "931it [00:09, 92.93it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "941it [00:10, 92.61it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19, 20, 21, 22, 23]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "951it [00:10, 92.83it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "966it [00:10, 93.54it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]],\n",
      "       device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]],\n",
      "       device='cuda:0')\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]], device='cuda:0')\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]],\n",
      "       device='cuda:0')\n",
      "testing loss: 3.4209263823294\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.5653133140258915"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.translate.bleu_score import sentence_bleu\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# from dataset import LangPairDataset\n",
    "test_ds = LangPairDataset(\"test\", max_length=128, data_dir=\"./wmt16\")\n",
    "test_dl = DataLoader(test_ds, batch_size=1, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "\n",
    "model = model.to(device)\n",
    "model.eval()\n",
    "collect = {}\n",
    "loss_collect = []\n",
    "\n",
    "predictions = []\n",
    "answers = []\n",
    "# 初始化BLEU分数列表\n",
    "bleu_scores = []\n",
    "for idx, batch in tqdm(enumerate(test_dl)):\n",
    "    encoder_inputs = batch[\"encoder_inputs\"]\n",
    "    encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "    decoder_inputs = batch[\"decoder_inputs\"]\n",
    "    decoder_labels = batch[\"decoder_labels\"]\n",
    "    # print(decoder_labels.cpu())\n",
    "    # decoder_labels1=tokenizer.decode(decoder_labels.cpu().numpy())\n",
    "    # print(decoder_labels1)\n",
    "    # 前向计算\n",
    "    outputs = model(\n",
    "        encoder_inputs=encoder_inputs,\n",
    "        decoder_inputs=decoder_inputs,\n",
    "        encoder_inputs_mask=encoder_inputs_mask\n",
    "        )\n",
    "    loss = loss_fct(outputs.logits, decoder_labels)         # 验证集损失\n",
    "\n",
    "    # print(outputs.logits.shape, decoder_labels.shape)\n",
    "\n",
    "    # loss = loss_fct(outputs.logits[:, :decoder_labels.shape[1]], decoder_labels)         # 验证集损失\n",
    "    # outputs = model.infer(encoder_inputs=encoder_inputs)\n",
    "    # print(outputs.logits.shape)\n",
    "    preds = outputs.logits.argmax(dim=-1) # 预测结果，[1,seq_len]\n",
    "    # print(preds.shape)\n",
    "    #把preds转为英文单词\n",
    "    preds = tokenizer.decode(preds.cpu().numpy()) #['预测句子']\n",
    "    # predictions.append(preds)\n",
    "    # print(preds)\n",
    "    #把decoder_labels转为英文单词\n",
    "    decoder_labels = tokenizer.decode(decoder_labels.cpu().numpy()) #['标签句子']\n",
    "    # answers.append(decoder_labels)\n",
    "    # print(decoder_labels)\n",
    "    belu=sentence_bleu([decoder_labels[0].split()],preds[0].split(),weights=(1, 0, 0, 0))\n",
    "    bleu_scores.append(belu)\n",
    "    collect[idx] = {\"loss\": loss.item(), \"src_inputs\": encoder_inputs, \"trg_inputs\": decoder_inputs, \"mask\": encoder_inputs_mask, \"trg_labels\": decoder_labels, \"preds\": preds}\n",
    "    loss_collect.append(loss.item())\n",
    "    # break\n",
    "\n",
    "# sort collect by value\n",
    "collect = sorted(collect.items(), key=lambda x: x[1][\"loss\"])\n",
    "print(f\"testing loss: {np.array(loss_collect).mean()}\")\n",
    "sum(bleu_scores) / len(bleu_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-06T13:16:14.099749Z",
     "start_time": "2024-05-06T13:16:13.991811900Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 535,
     "referenced_widgets": [
      "40f7e3754ad44b33acfe0a80b3648a3a",
      "b1e51beac50f4947a9dd235d8aa87603",
      "8cd9e9702e114ebc856f56975544ede8",
      "b7c7a718a8654956947108969557ca83",
      "20a27d1ec76f4d85b1ffe99401fbb5b7",
      "e0ddf3970b3e4248bc87d4649fa9c448",
      "d7bdde54e2534c49a207540bd258d3ae",
      "22484000400842f0b6e245dc610acbba",
      "a66a5b4ff37d4dafa4ba3081aa1359f4",
      "0b7866c29e5f4afe9b92de15f1b88c3e",
      "333e84a304184c57af1821620ae80f6a"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T05:21:08.091379Z",
     "iopub.status.busy": "2025-02-07T05:21:08.090960Z",
     "iopub.status.idle": "2025-02-07T05:21:10.733646Z",
     "shell.execute_reply": "2025-02-07T05:21:10.733085Z",
     "shell.execute_reply.started": "2025-02-07T05:21:08.091356Z"
    },
    "id": "KGSym4CbN4ya",
    "outputId": "f5e9c4c2-c92e-44e6-c83a-5cb720305428",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading vocabulary from ./wmt16/vocab ...\n",
      "Read 1524518 words (18107 unique) from vocabulary file.\n",
      "Loading codes from ./wmt16/bpe.20000 ...\n",
      "Read 20001 codes from the codes file.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  5%|▌         | 7/128 [00:00<00:02, 58.63it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[0],\n",
      "        [0],\n",
      "        [0],\n",
      "        [0]])\n",
      "tensor([[0, 1],\n",
      "        [0, 1],\n",
      "        [0, 1],\n",
      "        [0, 1]])\n",
      "tensor([[0, 1, 2],\n",
      "        [0, 1, 2],\n",
      "        [0, 1, 2],\n",
      "        [0, 1, 2]])\n",
      "tensor([[0, 1, 2, 3],\n",
      "        [0, 1, 2, 3],\n",
      "        [0, 1, 2, 3],\n",
      "        [0, 1, 2, 3]])\n",
      "tensor([[0, 1, 2, 3, 4],\n",
      "        [0, 1, 2, 3, 4],\n",
      "        [0, 1, 2, 3, 4],\n",
      "        [0, 1, 2, 3, 4]])\n",
      "tensor([[0, 1, 2, 3, 4, 5],\n",
      "        [0, 1, 2, 3, 4, 5],\n",
      "        [0, 1, 2, 3, 4, 5],\n",
      "        [0, 1, 2, 3, 4, 5]])\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6],\n",
      "        [0, 1, 2, 3, 4, 5, 6],\n",
      "        [0, 1, 2, 3, 4, 5, 6],\n",
      "        [0, 1, 2, 3, 4, 5, 6]])\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7]])\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8]])\n",
      "tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],\n",
      "        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 10%|█         | 13/128 [00:00<00:02, 45.15it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17]])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 15%|█▍        | 19/128 [00:00<00:02, 40.89it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18]])\n",
      "tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19],\n",
      "        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
      "         18, 19]])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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qRybfiIiIiIilWPTT0RERESkcjbb9EdFRWHatGmNXQYRERERUZNns3fv2bRpk3GmXiIiIiIiqj+bbfr9/f0buwQiIiIiIlVoEpf3hISEIDExES+88AK8vLzQtm1brFixonELJCIiIiJqImy26b/VwoUL0atXL2RkZODVV1/FK6+8gpMnT9a6vV6vR3FxsclCRERE5uE4SqQuTabpHzZsGF599VV07NgRs2bNQrNmzbB79+5at09KSoKPj49xCQoKuovVEhERNW0cR4nUpck0/V27djX+W1EUBAYG4uLF2uejjo2NRVFRkXHJz8+/G2USERGpAsdRInWx2Q/y3urWO/koigKDwVDr9hqNBhqNpqHLIiIiUiWOo0Tq0mTO9BMRERERUf2w6SciIiIiUjk2/UREREREKmez1/Tv2bPH+O/c3Nwaj2dmZt61WoiIiIiImjKe6SciIiIiUjk2/UREREREKmezl/c0FAd3NzgoLlbnVObmSaimgRiqpEVVXbosLcuxmb+0rEoP57o3soDmf89Jy2q73VFa1pnEvtKy2sUdlJZFRPZLX+QKh3JXq3McKiUU83+q3ORlAYAol5d1KUJecVVuirQsQEjMAoRBXm16vbwxvqDEW1qWs1ZefwUAV6us//8IAPRVFWZtxzP9REREREQqx6afiIiIiEjl2PQTEREREakcm34iIiIiIpVj009EREREpHJs+omIiIiIVI5NPxERERGRyjWppn/79u144IEH4OvrC61Wi+HDh+P06dONXRYRERERkU1rUk3/9evXMX36dBw5cgS7du2Cg4MDHn/8cRgMhhrb6vV6FBcXmyxERERkHo6jROrSpGbk/ctf/mLy9aeffoqAgABkZWUhPDzc5LGkpCTMnz//bpZHRESkGhxHidSlSZ3pP3XqFMaNG4f27dvD29sbISEhAIC8vLwa28bGxqKoqMi45Ofn3+VqiYiImi6Oo0Tq0qTO9I8YMQLBwcFYuXIlWrVqBYPBgPDwcJSXl9fYVqPRQKPRNEKVRERETR/HUSJ1aTJNf2FhIU6ePImVK1eif//+AID9+/c3clVERERERLavyTT9fn5+0Gq1WLFiBVq2bIm8vDzMnj27scsiIiIiIrJ5TeaafgcHB3z55Zf417/+hfDwcMTExOD9999v7LKIiIiIiGxekznTDwDR0dHIysoyWSeEaKRqiIiIiIiahiZzpp+IiIiIiOqHTT8RERERkco1qct7ZDCUlMKgVDZ2GU2GqKyQlmUovioty3n/cWlZACCc5P2vYHCS915aqZIWhatP9ZEXBsBrwyGpeUTURIj/W6zklXbW+pD/o/fuIC0LAAwSuyOvf8vrOVz+1EvLyn3UQ1oWAChOBmlZDg7yLt1u63lFWlYnl/PSsgAgpyxQSo4Bilnb8Uw/EREREZHKseknIiIiIlI5Nv1ERERERCrHpp+IiIiISOXY9BMRERERqVyTafrfeustdO/e3fj1hAkTMGrUqEarh4iIiIioqWgyTT8REREREdUPm34iIiIiIpWrd9P/9ddfIyIiAm5ubtBqtYiOjsb169eNl90kJiaiRYsW8PX1xdtvv43KykrMnDkT/v7+aNOmDT777DOTvFmzZiE0NBTu7u5o37495s6di4qK+k8MpdfrUVxcbLIQERGReTiOEqlLvZr+goICjBs3Di+88AKys7OxZ88ejB49GkLcmEEtNTUVv//+O/bt24dFixZh3rx5GD58OPz8/JCeno7Jkyfj5Zdfxm+//WbM9PLywurVq5GVlYXk5GSsXLkSixcvrvcLS0pKgo+Pj3EJCgqqdxYREZG94ThKpC71bvorKysxevRohISEICIiAq+++io8PT0BAP7+/li6dCk6d+6MF154AZ07d0ZJSQni4uLQqVMnxMbGwsXFBfv37zdmzpkzB/369UNISAhGjBiBGTNm4Kuvvqr3C4uNjUVRUZFxyc/Pr3cWERGRveE4SqQuTvV5Urdu3fDQQw8hIiICQ4YMweDBg/HEE0/Az88PANClSxc4OPzn/USLFi0QHh5u/NrR0RFarRYXL140rtuwYQOWLl2K06dP49q1a6isrIS3t3d9Xxc0Gg00Gk29n09ERGTPOI4SqUu9zvQ7Ojrihx9+wPfffw+dTodly5ahc+fOOHv2LADA2dnZZHtFUW67zmAwAAAOHjyIZ555BsOGDcN3332HjIwMvPnmmygvL69PeUREREREdJN6nekHbjTt999/P+6//37Ex8cjODgY33zzTb2y0tLSEBwcjDfffNO47ty5c/UtjYiIiIiIblKvpj89PR27du3C4MGD0bx5c6Snp+OPP/5AWFgYfvnlF4vzOnXqhLy8PHz55Zfo3bs3tm7dWu83EEREREREZKpel/d4e3tj3759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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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Ozsbp06dwtKlSxEREQEA2Lt3r5mzIiIiIiKimmDxUwFPT094eXlhyZIl8PPzQ2ZmJqZOnWrutIiIiIiIqAZ4z08FVCoV1q5diyNHjiAsLAzR0dH48MMPzZ0WERERERHVAM/8VKJXr15IS0vTmyeEMFM2RERERERUUzzzQ0REREREVoHFDxERERERWQUWP0REREREZBV4z48Rlf55DYpiZ+40jKrEv560WG67zkiLJQpvS4tlH9xWWiwAuBTTTVqsRnH7pcUiIut0Oc8NNqU1H//ntre89k5tWywtFgCsuNZdWiwtFGmx+niekBbr4g1PabEAwN8jV1qs9FxfabEu57lKiyWcSqXFAgBfhzxpsU490EparGJXef837fL8pMUCgPyGDlLilBQrQFLVluWZHyIiIiIisgosfoiIiIiIyCqw+CEiIiIiIqtg9cVPUFAQFi5ceM9ldu3aBUVRcPPmTZPkRERERERE8ll9hweHDh2Cs7OzudMgIiIiIiIjs/rix8fH557PFxfL7XGGiIiIiIjMo85f9paXl4cRI0bA2dkZfn5+iI+PR1RUFCZNmgSg/GVviqLg888/xxNPPAFnZ2e899575kmciIiIiIikqvPFz+TJk7Fv3z5s2rQJv/76K/bs2YOjR4/e8zWzZs3CoEGDcPz4cYwZM8ZEmRIRERERkTHV6cve8vLysGLFCqxevRqPPPIIAGD58uXw9/e/5+ueffZZvPDCC7rH586du+fyGo0GGo1G9zg3V97AYERERDKwrSIiquNnfs6dO4fi4mJ07txZN8/d3R0tWrS45+s6duxo0PvExcXB3d1dNwUEBFQrXyIiImNhW0VEVMeLn+oytPe3mJgY5OTk6KasrCwjZUZERFQ9bKuIiOr4ZW9NmzaFnZ0dDh06hMDAQABATk4OMjIy0KNHD2nvo1aroVarpcUjIiKSjW0VEVEdL35cXV0xatQovPnmm6hXrx7q16+PmTNnQqVSQVEUc6dHREREREQmVOcve/v444/RtWtX9O/fH7169cJDDz2EVq1awcHBwdypERERERGRCdXpMz/AnbM/q1at0j3Oz8/H7Nmz8eKLLwIALly4oLe8EKJcjKioqArnExERERFR7VHni5/k5GT8/vvv6Ny5M3JycjBnzhwAwMCBA82cGRERERERmVKdL34A4KOPPsKpU6dgb2+PDh06YM+ePfD29jZ3WkREREREZEJ1vvh54IEHcOTIEXOnQUREREREZlbnix+zEloAWklxJJF979LhNGmhSiWup2JjIy2W+9nb0mIBgFeK5v4LVdHF78OkxQp46oS0WERUe9wusIcKNe8Ce8vlUAnZ3JH1Zz1psQAAQl4Prw80vygtVmz6Y9Ji3S6wlxYLAK6oXKXFKsiX18W6NtdOWiwb92JpsQBgc1prabHEaHl9ktk6yVtP7RW5HYYpvnK+Y2kLbgPrq7Zsne/tjYiIiIiICGDxQ0REREREVoLFDxERERERWQUWP0REREREZBVY/BARERERkVVg8UNERERERFbBKosfjUaD119/HfXr14eDgwO6d++OQ4cOAQB27doFRVGwY8cOdOzYEU5OTujWrRtOnTpl5qyJiIiIiKgmrLL4eeutt7B+/XqsWLECR48eRfPmzdGnTx/cuHFDt8w777yDBQsW4PDhw7C1tcWYMWPMmDEREREREdWU1Q1ymp+fj88//xwJCQno27cvAGDp0qX49ddf8eWXX6JTp04AgPfeew+RkZEAgKlTp+Lxxx/H7du34eBQfnAnjUYDjeb/D1yZm5trgjUhIiKqOrZVRERWeObn7NmzKC4uxkMPPaSbZ2dnh86dOyM9PV03r23btrq//fz8AADXrl2rMGZcXBzc3d11U0BAgJGyJyIiqh62VUREVlj8VJWdnZ3ub0VRAABarbbCZWNiYpCTk6ObsrKyTJIjERFRVbGtIiKywuKnWbNmsLe3x759+3TziouLcejQIYSGhlYrplqthpubm95ERERkSdhWERFZ4T0/zs7O+Ne//oU333wT9erVQ2BgID744AMUFBRg7NixSE1NNXeKRERERERkBFZX/ADA/PnzodVq8fzzzyMvLw8dO3bE1q1b4enpae7UiIiIiIjISKyy+HFwcMAnn3yCTz75pNxzUVFREELozWvfvn25eUREREREVLtY3T0/RERERERknVj8EBERERGRVWDxQ0REREREVsEq7/kxGUV1Z6ohlVreZtIWFUuLBQCKnbzcRHGJvFhaefdoqfYdkxYLAMQDLaXFqv+lo7RYpz8NlxYr+NVEabGIyLjEFQcIB4cax7l0XS0hm//jUiovFgCHi/bSYiUXB0mLBa0iLZRtro20WABQ2EheLG2xvN/aVW7yvsc08b0uLRYAXLjqJS1WjxYZ0mIVC4nnOprICwUAF3LlfGYlDhpcrOKyPPNDRERERERWgcUPERERERFZBRY/RERERERkFVj8EBERERGRVbCq4mfXrl1QFAU3b940dypERERERGRidbr4iYqKwqRJk8ydBhERERERWYA6XfwQERERERGVqbPFz+jRo7F7924sWrQIiqJAURRcuHABAHDkyBF07NgRTk5O6NatG06dOqX32o0bN+LBBx+Eg4MDmjZtitmzZ6OkRN4YNEREREREZHp1tvhZtGgRunbtivHjx+Py5cu4fPkyAgICAADvvPMOFixYgMOHD8PW1hZjxozRvW7Pnj0YOXIkJk6ciLS0NHzxxRdISEjAe++9V+l7aTQa5Obm6k1ERESWhG0VEVEdLn7c3d1hb28PJycn+Pr6wtfXFzY2d0Y/fu+99xAZGYnQ0FBMnToV+/fvx+3btwEAs2fPxtSpUzFq1Cg0bdoUjz76KObOnYsvvvii0veKi4uDu7u7biorsoiIiCwF2yoiojpc/NxL27ZtdX/7+fkBAK5duwYASE1NxZw5c+Di4qKbys4eFRQUVBgvJiYGOTk5uikrK8v4K0FERGQAtlVERICtuRMwBzs7O93fiqIAALRaLQDg1q1bmD17NgYPHlzudQ4ODhXGU6vVUKvVRsiUiIhIDrZVRER1vPixt7dHaWmpQa958MEHcerUKTRv3txIWRERERERkTnU6eInKCgIiYmJuHDhAlxcXHRnd+5lxowZ6N+/PwIDA/HUU09BpVIhNTUVJ06cwLx580yQNRERERERGUOdvudnypQpsLGxQWhoKHx8fJCZmXnf1/Tp0wc//fQTtm3bhk6dOqFLly6Ij49H48aNTZAxEREREREZS50+8xMSEoIDBw7ozRs9erTe4/bt20MIoTevT58+6NOnj7HTIyIiIiIiE6rTZ36IiIiIiIjKsPghIiIiIiKrUKcvezM3lYsTVIp9jeOU/v23hGyMQxTdvxOJqgcT91/GDBTJXcOKIyelxVKrbKTFEgM6SIt1ZVI3abEAwHfhfqnxiOj/UxUrUNkoNY7jdqbmMXQUub/NljhJDPaH3f2XqSLbiocPrBatvLQAAAXe8toXxws1/y5URrTNkxarqet1abEA4GxWfWmx/hOwW1qszJJCabGa2blIiwUAP+bLiVeQV4rEKi7LMz9ERERERGQVWPwQERER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CHt7eyxevBjnzp3Dpk2bMHfu3ApjzJkzBzt27MCJEycwevRoeHt748knn9Q97+npicGDB+PNN99E79690ahRIxOtHRERERERGUutK35GjhyJwsJCdO7cGa+88gomTpyIF198ET4+PkhISMB3332H0NBQzJ8/Hx999FGFMebPn4+JEyeiQ4cOuHLlCv773//C3t5eb5mxY8eiqKhIrxMFIiIiIiKqvWpVb2+7du3S/f3555+Xe3748OEYPny43ryyMYAAICoqSve4f//+93yvP/74A15eXhg4cGANMiYiIiIiIktRq4ofUygoKMDly5cxf/58vPTSS+XOCBERERERUe1U6y57M7YPPvgALVu2hK+vL2JiYsydDhERERERScIzP/8wa9YszJo1S04wbSmg1Ly+VOzknX0SxYZ1+33/gOL+y9RyKgcHqfFESYnUeLJoCwqkxVLs5B5ahJ2NtFgep7XSYhW5VN4FvqFsWjSXFgsASk+dkRqP6i6VfwFUTjX/f1F8U96xUimV938eAIrd5P2/h8RQMhX6l0qNZ6vIa99VRfKOlcpVed+Jzvl6S4sFAFcue0qLlejeRFqsvwpdpMXy97kpLRYAtHa/LCWOxqYYO6q4LM/8EBERERGRVWDxQ0REREREVoHFDxERERERWQUWP0REREREZBVY/BARERERkVVg8UNERERERFaBxQ8REREREVkFFj9ERERERGQVOMipBBqNBhqNRvc4NzfXjNkQERGVx7aKiIhnfqSIi4uDu7u7bgoICDB3SkRERHrYVhERsfiRIiYmBjk5ObopKyvL3CkRERHpYVtFRMTL3qRQq9VQq9XmToOIiKhSbKuIiHjmh4iIiIiIrASLnyr69NNP8cgjj5g7DSIiIiIiqiYWP1V0/fp1nD171txpEBERERFRNbH4qaJZs2bhwoUL5k6DiIiIiIiqicUPERERERFZBRY/RERERERkFVj8EBERERGRVeA4P8akKHemGhLFRRKSMRIJ61dGJXH8CVFSIi9WqVZaLAAQWiEtlo2ni7RYpdk3pMWCjY28WACU3y9Ii+V6+Ja0WIq9vbRYcvcywPl/PtJi5ff4S1ossjwODiWwcSiucZxirYOEbO5wbHVTWiwAcHHQSIt1+YqntFhtm1ySFquwxE5aLAC4mC1vPRu2vSwt1sU/vKXF+iPLS1osAFDsS6XF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khLcvn3boPdVq9Vwc3PTm4iIiCwJ2yoiolrY21t2djauXLmiN8/DwwMODg6Ijo7Gxo0bMWDAAL2urmNjY5Geno7t27dDURQAdwYwHT58ODp27AgvLy+kpaVh2rRp6NmzJxsEIiIiIqI6qNYVP7169So3b82aNRg2bBgcHBywc+dOxMbGYtq0abh48SJcXV3Rs2dPHDx4EGFhYbrX9OnTBytWrMC0adNQUFAAf39/9O/fHzNmzDDl6hARERERkYnUmuInKCioSp0ZODk5Yd68eZg3b949l4uJiUFMTIys9IiIiIiIyMJZ9D0/n332GVxcXHD8+HGzvH/fvn3RunVrs7w3ERERERHJZbFnflatWoXCwkIAQGBgoFlyWLZsmdlzICIiIiIiOSy2+GnYsKG5U7CIHIiIiIiISA6LLX7oLkJr7gzIGsjcz/6vV0VZhIFjb92LqsCwruzvpTT7b2mxFHs7abEAwCErR1osN5d60mJlj+0qLZbXlwekxbJmJSU2UBXb1DiOukji//tSeaEAQNhVbQD0qlC08taztETe3QeiVO5xV+Y3D6VYYm5yV1MqUSpve/o43pIW62aRo7RY3mp5eQGAVtIGLbar+vcEi77nh4iIiIiISBYWP0REREREZBVY/BARERERkVVg8UNERERERFbBYoufqKgoKIoCRVGQkpJitTkQEREREZEcFlv8AMD48eNx+fJlhIWF4cKFC7pC5J/TwYMHda8pLCzEzJkzERISArVaDW9vbwwdOhQnT57Ui11QUICYmBg0a9YMDg4O8PHxQWRkJDZu3KhbZsOGDUhKSjLZ+hIRERERkfFYdFfXTk5O8PX11Zu3fft2tG7dWm+el5cXAECj0aBXr17IzMzEggULEB4ejqtXryIuLg7h4eHYvn07unTpAgCYMGECEhMTsXjxYoSGhiI7Oxv79+9Hdna2Lm69evWQm5tr5LUkIiIiIiJTsOjipyJeXl7lCqIyCxcuxIEDB5CcnIx27doBABo3boz169cjPDwcY8eOxYkTJ6AoCjZt2oRFixahX79+AICgoCB06NDBZOtBRERERESmZdGXvRlq9erVePTRR3WFTxmVSoXo6GikpaUhNTUVAODr64vNmzcjLy+vxu+r0WiQm5urNxEREVkStlVERLWw+OnWrRtcXFz0pjIZGRlo1apVha8rm5+RkQEAWLJk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2rBDRBZAkRZJlGqkxQIArSiWFksRWmmxhMS8ZBNaedtAWypv39CWyPv8ZSsplnPALim502NoVcedM5ey/LSFcvYVmf/ttYUl8oIBQLG8C12kbtUCif9PJa4jACgqeWsqCuV93VS08o5HpRI/fwDQFsrLrTjfsGFX7hlL4n+nohK57V5xoZz1LPm/z6sqx11FWPrRuRa6dOkSB48jIrJyWVlZaNSokbnTqBTbKiKqa6py3GXxYwRarRZ//vknXF1ddV1rVyQ3NxcBAQHIysqqcffalhrLknOz1FiWnJulxrLk3Cw1liXnZqmxqhpPCIG8vDz4+/tDpbLcW2vZVtWO3Cw1liXnZqmxLDk3S41V1XiGHHct9rK32kylUhn0a5/MweYsNZbseNYQS3Y8a4glO541xJIdzxpiVSWeu7u7tPcyFrZVxo9nDbFkx7OGWLLjWUOsqsSr6nHXcn+SIiIiIiIikojFDxERERERWQUWP2akVqsxc+ZMqNXqOhtLdjxriCU7njXEkh3PGmLJjmcNsYwRrzaw1O1hydvWGmLJjmcNsWTHs4ZYxojHDg+IiIiIiMgq8MwPERERERFZBRY/RERERERkFVj8EBERERGRVWDxQ0REREREVoHFDxERERERWQUWP0REREREZBVY/BARERERkVVg8UNERERERFbh/wF7nzuKuDkKNgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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Q7Bq999/PxYuXFj/4omIyGwuXbqEt99+W3/39ZtPxp08edIidRUUFMDT07PGeg8PDxQWFjZ4PbfDqT6S3HvvvUZtrygKNmzYYNK1yP9uXFxccOzYMQQHB0Oj0SAjIwPt27dHXl4e7r//foteKjMoKAgvv/wy4uPjLVaDLWvatCm+++67GlNwjh49ioceegi//fabUXmurq44cuQImjdvbnAn4MLCQrRt2xZXr16VWf5tHT582OjnhIWFoVEj85+vkVmbtWaZI4+sx90yJvMdZeMMHz4c27dvx7PPPlvr3ddfe+01i9TVp08fODo64vPPP8c999wDADh79ixGjBiBq1evYvv27XfMaKjjEY9ekuTk5GDSpElwdXW947ZCCLz99tvQarUNUJn18/LywsWLFwFcb/SOHj2K9u3b488//8Tly5ctWtuFCxcQGxtr0RpsWVlZGX7//fca63///Xf934wxZN8QrD46depU48Ngt6NSqZCfn48WLVqYuTK5tVlrljnyyHrcDWMy31E23rfffotvvvkGvXr1snQpBpYuXYrBgwcjMDAQAQEBAIDi4mK0bt0aX3/9dZ0yGup4xMZfoilTpqBJkyZ12jY1NdXM1dw9+vTpg++//x7t27dHbGwsXnvtNWzduhXff/89HnjgAYvWFhsbi++++w5jx461aB22avDgwXjuueeQmpqK7t27AwCysrIwZcoUDBkyxOg82TcEq6+srCz4+PjccTshBMLDwxugor/IrM1as8yRR9bD2sfkpKQkvPXWW3xH2QheXl5o3LixpcuooVWrVjh8+DC+//57/PjjjwCA0NBQxMTE1HhX4nYa4njExl+Sn3/+uU7/WNVyc3Ph7+9vxoruHgsXLtRPsXjjjTdgb2+PXbt2YejQoZg+fbpFa2vVqhVmzJiBPXv2oH379jVu+DR+/HgLVWYbPv74Y0yePBlPPfUUKioqAACNGjXC6NGjMXfuXKPzkpOT8corryAgIABVVVUICwvT3xCsof/WoqKi0KpVq1rnhdamT58+cHJyMm9R/yOzNmvNMkceWY+7YUzmO8rGmzNnDhITE5GWlgZnZ2dLl2NAURQ89NBDeOihh0x6fkMdjzjHn+g2bp4SciNFUSz2QSJbc+nSJRQUFAAAWrZsCRcXl3rlybohGBGRqUaPHo1u3brxHWUjdO7cGQUFBRBCIDg4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PPDAA7h8+TL69OkDtVqNyZMn49VXXzWqRplj8vvvv2/wvRACp0+fxueff47+/fsbVVd991H2WCWzthuJm66HP336dISGhuKf//yn0XXJGPca6nikiJv3nEwSHR1t9OUAV65cWev85Tv5448/4OXlZfTP69u37y0fUxTFqE+wy6zrm2++QWRkJNzd3ev182/HmNpu93u6kSV/Z8899xzef//9eh1M+/bti//85z/w9PS02r+NauXl5cjLy4OTkxNat25tcIm+O2nIf0/g+nWmz58/j5kzZ952u4Y8ZliyNmvNMkceWQ9z/9teu3YNP/30E8rLyxEWFgZXV1eja5R53L35MpvVl6a8//77kZCQYNJYIWMfZYxV5qrtl19+QWBgYI2/k2PHjmH//v0mvQC4kbHjXkMdj9j4ExERERHZgPp9jJyIiIiIiO4KbPyJiIiIiGwAG38z02q1ePPNN/V3l2NWw+bZQpbsPFvIkp1nC1my82whi6yPtf6tWGuW7DxbyJKdJ7s2zvE3s7KyMnh4eKC0tLTeH161hSxrrs1as6y5NmvNsubarDXLmmuz1iyyPtb6t2KtWdZcm7VmWXttPONPRERERGQD2PgTEREREdkA3sDLRDqdDr/99hvc3Nxue93VsrIyg//Why1kyc6zhSzZebaQJTvPFrJk593tWUIIXLx4Ef7+/lCpeA7N0jgmmydLdp4tZMnOq0uWMccjzvE30a+//oqAgABLl0FERBZUXFyMZs2aWboMm8cxmahuxyOe8TdR9V3ofjkYDHfX+p/tGRzSvt4ZRETUMCpRgZ3YKP2OpGSa6n+HoI8mQeVU9zt738o/w7LqnXGjNSe7SMsqL5b3N9e500lpWcfPN5GWBQAuDtekZZ075yEtC1flvsOncquod4buiha/jn+nTscjNv4mqn4r0d1VBXe3+v8RNFLs651BREQN5H/vld9uWgk1nOp/B5WTGipnx3rnObrKbY/snOv/YqSayqn++1fN3sVBWpbdZXn7CAB2ann/b8n8nUGR3Pg720nLqsvxiBMTiYiIiIhsABt/IiIiIiIbwMafiIiIiMgGsPEnIiIiIrIBbPyJiIiIiGyATTf+mzZtQu/eveHp6QmNRoOBAweioKDA0mUREREREUln043/pUuXMHHiROzfvx9btmyBSqXC4MGDodPpamyr1WpRVlZmsBAR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XT7jJqGav3j6y8ty+VXe9By7K/Km07j9KncKzPled96mrmLC86RlPa45IC0LACpE/VtxRamq87Y8409EREREZAPY+BMRERER2QA2/kRERERENoCNPxERERGRDbCZxj86OhoTJkywdBlERERERBZhM1f1WbduHezt7S1dBhERERGRRdhM49+4cWNLl0BEREREZDE2OdUnODgYycnJGDVqFNzc3BAYGIhFixZZtkAiIiIiIjOymcb/ZqmpqejatSuys7Px8ssv46WXXsLx48dvub1Wq0VZWZnBQkRERA2PYzKRaWy28R8wYABefvlltGrVCvHx8fD29sa2bdtuuX1KSgo8PDz0S0BAQANWS0RERNU4JhOZxmYb/w4dOui/VhQFvr6+OHfu3C23T0hIQGlpqX4pLi5uiDKJiIjoJhyTiUxjMx/uvdnNV/hRFAU6ne6W26vVaqjVanOXRURERHfAMZnINDZ7xp+IiIiIyJaw8SciIiIisgFs/ImIiIiIbIDNzPHPyMjQf11YWFjj8ZycnAarhYiIiIioofGMPxERERGRDWDjT0RERERkA2xmqo+5KA4OUBT7O294ByqJlyWrunhRWhYAQJH3+lCxV6RliYvl0rJUiry6AKDZ19ekZV1t1URa1k/v3ictq9XEPdKyiIhkECpA2NU/JyK8oP4hNyj5IkhalvpPCTv4P2VBEs//SuiFbqT+Vd64vOVquLSsjIsd7ryREd4c/GW9M66IyjpvyzP+REREREQ2gI0/EREREZENYONPRERERGQD2PgTEREREdkANv5ERERERDaAjT8RERERkQ1g409EREREZANsuvHftGkTevfuDU9PT2g0GgwcOBAFBXKv3UtEREREZA1suvG/dOkSJk6ciP3792PLli1QqVQYPHgwdDpdjW21Wi3KysoMFiIiImp4HJOJTGPTd+4dOnSowfdLly6Fj48PcnNzER5ueJe3lJQUzJo1qyHLIyIiolpwTCYyjU2f8T9x4gSGDx+OFi1awN3dHcHBwQCAoqKiGtsmJCSgtLRUvxQXFzdwtURERARwTCYylU2f8R80aBCCgoKwePFi+Pv7Q6fTITw8HNeuXauxrVqthlqttkCVREREdCOOyUSmsdnGv6SkBMePH8fixYsRGRkJANi5c6eFqyIiIiIiMg+bbfy9vLyg0WiwaNEi+Pn5oaioCFOn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0XP8iayGxFlqovyStCwAUFnr9aXL5f0v7/y73Pc7VZ3C7rxRHelycqVlEdFdRAUppzQdz8ubSgoAlad+k5bVyEHetBXFzVtalupKhbQsALDT6qRlVckckuX+acCnUVm9My7b1X26OM/4ExERERHZADb+REREREQ2gI0/EREREZENYONPRERERGQDpDb+0dHRmDBhQq2PjRw5Eo8//ni98mVkEBERERHZoga7qs+CBQtw473CoqOj0alTJ8yfP7+hSiAiIiIislkN1vh7eHg01I8iIiIiIqKbmHWO/zfffAMPDw+sWLHCYJrOyJEjsX37dixYsACKokBRFBQWFgIAjh07hoEDB8Ld3R1ubm6IjIxEQUGBQe68efPg5+cHjUaDV155BRUVf107VqvVYvLkyWjatClcXFwQERGBjIwM/ePLly+Hp6cnNm/ejNDQULi6uuLhhx/G6dOnzfmrICIiIiKyKLM1/itXrsTw4cOxYsUKPP300waPLViwAD169MCYMWNw+vRpnD59GgEBATh16hT69OkDtVqNrVu34sCBAxg1ahQqK/+6UdC2bdtQUFCAbdu2IS0tDcuXL8fy5cv1j48bNw67d+/G6tWrcfjwYcTGxuLhhx/GiRMn9NtcvnwZ8+bNw+eff44ffvgBRUVFmDx58m33R6vVoqyszGAhIiKihscxmcg0Zpnq8+GHH+KNN97A//3f/yEqKqrG4x4eHnBwcICzszN8fX0Nnufh4YHVq1fD3v76nelCQkIMnuvl5YWFCxfCzs4Obdu2xSOPPIItW7ZgzJgxKCoqwrJly1BUVAR/f38AwOTJk7Fp0yYsW7YMycnJAICKigp8/PHHaNmyJYDrLxZmz559231KSUnBrFmzTP+lEBERkRQck4lMI73x/+qrr3Du3DlkZmaiW7duRj03JycHkZGR+qa/Nu3atYOdnZ3+ez8/Pxw5cgQAcOTIEVRVVdV4saDVaqHRaPTfOzs765v+6oxz587dtraEhARMnDhR/31ZWRkCAgLqtmNEREQkDcdkItNIb/w7d+6MgwcPYunSpejatSsURanzc52cnO64zc0vChRFgU6nAwCUl5fDzs4OBw4cMHhxAACurq63zbjxikO1UavVUKvVd6yPiIiIzItjMpFppDf+LVu2RGpqKqKjo2FnZ4eFCxfWup2DgwOqqqoM1nXo0AFpaWmo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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['man in white shirt on a small boat in a small boat.',\n",
       " 'a man with a backpack and a girl on the beach with a baby.',\n",
       " 'three men on horses are being pulled by a track while a third is being pulled on it.',\n",
       " 'a man and woman are looking at food in a crowded kitchen.']"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "from fastBPE import fastBPE\n",
    "from sacremoses import MosesDetokenizer, MosesTokenizer\n",
    "\n",
    "# `MosesTokenizer` 和 `MosesDetokenizer` 是来自 `sacremoses` 库的工具，用于自然语言处理中的分词（Tokenization）和去标记化（Detokenization）。这些工具主要用于对文本进行预处理和后处理，通常在处理自然语言处理任务时会用到。\n",
    "#\n",
    "# ### MosesTokenizer：\n",
    "# - **作用**：将原始文本分割成单词和标点符号。\n",
    "# - **特点**：基于 Moses 翻译工具中使用的分词方法。\n",
    "# - **功能**：\n",
    "#   - 将句子分割成单词和标点符号。\n",
    "#   - 处理缩写、连字符、标点等特殊情况。\n",
    "#   - 对文本进行标记化，方便后续处理。\n",
    "#\n",
    "# ### MosesDetokenizer：\n",
    "# - **作用**：将分词后的文本重新组合成原始的句子。\n",
    "# - **特点**：用于对分词后的文本进行还原，使其恢复为可读的句子形式。\n",
    "# - **功能**：\n",
    "#   - 将分词后的单词和标点符号重新组合成句子。\n",
    "#   - 处理分词后的标点、缩写等情况，使得结果更加自然和可读。\n",
    "#\n",
    "# 这些工具通常在文本预处理和后处理过程中使用，对输入的文本进行标记化和去标记化，是一种常用的处理方式。在自然语言处理任务中，对文本进行正确的分词和还原是很重要的，而 `MosesTokenizer` 和 `MosesDetokenizer` 提供了方便、高效的工具来处理这些任务。\n",
    "\n",
    "class Translator:\n",
    "    def __init__(self, model, src_tokenizer, trg_tokenizer):\n",
    "        self.bpe = fastBPE(\"./wmt16/bpe.20000\", \"./wmt16/vocab\")\n",
    "        self.mose_tokenizer = MosesTokenizer(lang=\"de\")\n",
    "        self.mose_detokenizer = MosesDetokenizer(lang=\"en\")\n",
    "        self.model = model\n",
    "        self.model.eval()\n",
    "        self.src_tokenizer = src_tokenizer\n",
    "        self.trg_tokenizer = trg_tokenizer\n",
    "        self.pattern = re.compile(r'(@@ )|(@@ ?$)')\n",
    "\n",
    "    def draw_attention_map(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "        attn_scores (numpy.ndarray): 表示自注意力机制（self-attention）分数。\n",
    "        cross_attn_scores (numpy.ndarray): 表示交叉注意力机制的注意力分数。\n",
    "        src_words_list (list): 源语言句子的单词列表。\n",
    "        trg_words_list (list): 目标语言句子的单词列表。\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "\n",
    "        fig = plt.figure(figsize=(10, 5), constrained_layout=True) # constrained_layout=True 自动调整子图参数，使之填充整个图像区域\n",
    "        grid = plt.GridSpec(trg_len, trg_len + src_len, wspace=0.1, hspace=0.1)# wspace,hspace 控制子图之间的间距\n",
    "        #下面是attn_scores的热力图\n",
    "        self_map = fig.add_subplot(grid[:,:trg_len]) #  添加子图\n",
    "        self_map.matshow(attn_scores.mean(dim=0), cmap='viridis') # 绘制热力图，cmap表示颜色,dim=0表示对第0维求均值\n",
    "        self_map.set_yticks(range(trg_len), trg_words_list, fontsize=10)\n",
    "        self_map.set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "        #下面是cross_attn_scores的热力图\n",
    "        cross_map = fig.add_subplot(grid[:, trg_len:])\n",
    "        cross_map.matshow(cross_attn_scores.mean(dim=0), cmap='viridis')\n",
    "        cross_map.set_yticks(range(trg_len), [], fontsize=6)\n",
    "        cross_map.set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "    def draw_attention_maps(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list, heads_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "\n",
    "        Args:\n",
    "            - scores (numpy.ndarray): shape = [source sequence length, target sequence length]\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "        # cross_attn_scores = cross_attn_scores[:, :len(src_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "        fig, axes = plt.subplots(2, len(heads_list), figsize=(5 * len(heads_list), 10))\n",
    "        for i, heads_idx in enumerate(heads_list):\n",
    "            axes[0, i].matshow(attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[0, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[0, i].set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "            axes[0, i].set_title(f\"head {heads_idx}\")\n",
    "            axes[1, i].matshow(cross_attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[1, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[1, i].set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "            axes[1, i].set_title(f\"head {heads_idx}\")\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "\n",
    "    def __call__(self, sentence_list, heads_list=None, layer_idx=-1):\n",
    "        # 将输入句子列表转换为小写，并使用 MosesTokenizer 进行分词处理。\n",
    "        sentence_list = [\" \".join(self.mose_tokenizer.tokenize(s.lower())) for s in sentence_list]\n",
    "        # 将分词后的结果进行 BPE 编码，得到 tokens_list。\n",
    "        tokens_list = [s.split() for s in self.bpe.apply(sentence_list)]\n",
    "        # 使用 src_tokenizer 对 tokens_list 进行编码，同时添加起始标记 ([BOS]) 和结束标记 ([EOS])。\n",
    "        encoder_input, attn_mask = self.src_tokenizer.encode(\n",
    "            tokens_list,\n",
    "            add_bos=True,\n",
    "            add_eos=True,\n",
    "            return_mask=True,\n",
    "            )\n",
    "        encoder_input = torch.Tensor(encoder_input).to(dtype=torch.int64)\n",
    "        # 使用模型的 infer 方法对编码器输入进行推理，得到输出结果 outputs\n",
    "        outputs = model.infer(encoder_inputs=encoder_input, encoder_inputs_mask=attn_mask)\n",
    "\n",
    "        preds = outputs.preds.numpy()\n",
    "        # 使用目标语言的 trg_tokenizer 对预测序列进行解码，得到解码后的目标语言句子列表 trg_decoded。\n",
    "        trg_decoded = self.trg_tokenizer.decode(preds, split=True, remove_eos=False, remove_bos=False, remove_pad=False)\n",
    "        # 使用源语言的 src_tokenizer 对编码器输入进行解码，得到解码后的源语言句子列表 src_decoded。为下面绘制热力图做准备。\n",
    "        src_decoded = self.src_tokenizer.decode(\n",
    "            encoder_input.numpy(),\n",
    "            split=True,\n",
    "            remove_bos=False,\n",
    "            remove_eos=False\n",
    "            )\n",
    "\n",
    "        # post processed attn scores\n",
    "        # outputs.decoder_attentions[-1]  # the last layer of self-attention scores\n",
    "\n",
    "        # draw the attention map of the last decoder block\n",
    "        for attn_score, cross_attn_score, src, trg in zip(\n",
    "            outputs.decoder_self_attn_scores[layer_idx], outputs.decoder_cross_attn_scores[layer_idx], src_decoded, trg_decoded):\n",
    "            if heads_list is None:# 如果没有指定heads_list，就画单个热力图\n",
    "                self.draw_attention_map(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                )\n",
    "            else:# 如果指定了heads_list，就画多个热力图\n",
    "                self.draw_attention_maps(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                    heads_list=heads_list,\n",
    "                    )\n",
    "        return [self.mose_detokenizer.tokenize(self.pattern.sub(\"\", s).split()) for s in self.trg_tokenizer.decode(preds)] #将解码后的目标语言句子列表返回，并使用 mose_detokenizer 进行去标记化，最终得到翻译后的结果。\n",
    "\n",
    "\n",
    "# sentence_list = [\n",
    "#     \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "#     \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "#     \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "#     \"Ein Mann und eine Frau essen zu Abend\",  # 一个男人和一个女人在吃晚餐\n",
    "# ]\n",
    "sentence_list = [\n",
    "    \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "    \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "    \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "    \"Ein Mann und eine Frau essen zu Abend\",  # 一个男人和一个女人在吃晚餐\n",
    "]\n",
    "\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "translator = Translator(model.cpu(), tokenizer, tokenizer)\n",
    "translator(\n",
    "    sentence_list,\n",
    "    layer_idx=-1,\n",
    "    # heads_list=[0, 1, 2, 3, 4, 5, 6, 7]\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T04:57:17.429557Z",
     "iopub.status.busy": "2025-02-07T04:57:17.429195Z",
     "iopub.status.idle": "2025-02-07T04:57:17.561044Z",
     "shell.execute_reply": "2025-02-07T04:57:17.560414Z",
     "shell.execute_reply.started": "2025-02-07T04:57:17.429533Z"
    },
    "id": "e0WkUQuUe-Cy",
    "outputId": "433e3d70-4f34-4376-e4a3-1b8834e71f88",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "translate-transformer-not-share\n"
     ]
    }
   ],
   "source": [
    "!ls checkpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "_1ZLtdahywWf"
   },
   "outputs": [],
   "source": [
    "# prompt: 把best.ckpt复制到云盘内\n",
    "\n",
    "!cp -r checkpoints/translate-transformer-not-share/best.ckpt /content/drive/MyDrive/transformer-de-en\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "00fe6a550df547cea5b1e0d84c1a3f5f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_83f345f7424c43929d7a304cbfb6d0fe",
      "max": 9714,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_58d69d086f644e89937347e1f9261d6f",
      "value": 9714
     }
    },
    "013d2a6b90144432bbfb15136235faba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0b7866c29e5f4afe9b92de15f1b88c3e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0c0c7229347b49ffbb9a0f7bd41199b9": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "0e10428326bc436e8dbc079e89570bde": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "0fe4ed7283c04496affe727c235d31c4": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "19f846338f6b48c9930b58575641e5b8": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "20a27d1ec76f4d85b1ffe99401fbb5b7": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22484000400842f0b6e245dc610acbba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22aa774ab39e4fd78b0ff08d430d2b5d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4e64bcb87e584beda0408a0aa5a659ae",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_b077d7562d814df5b6d839464dd4122f",
      "value": 1
     }
    },
    "2b82e42c34804b13bc83be4c7009d4e2": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "333e84a304184c57af1821620ae80f6a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "40f7e3754ad44b33acfe0a80b3648a3a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_b1e51beac50f4947a9dd235d8aa87603",
       "IPY_MODEL_8cd9e9702e114ebc856f56975544ede8",
       "IPY_MODEL_b7c7a718a8654956947108969557ca83"
      ],
      "layout": "IPY_MODEL_20a27d1ec76f4d85b1ffe99401fbb5b7"
     }
    },
    "434ac4c51db74681942d2d3bd869b1df": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "46a51a1719d8444eb5877720253d3c37": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "4e64bcb87e584beda0408a0aa5a659ae": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "20px"
     }
    },
    "55146ac7395840dca847e0f63aa80561": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_abb9bc76c0ce4634bd340be20c074b8c",
       "IPY_MODEL_a89d790df59245fcaf26335d4903c9b4",
       "IPY_MODEL_f837255914194dc792cf1514dee03dc5"
      ],
      "layout": "IPY_MODEL_46a51a1719d8444eb5877720253d3c37"
     }
    },
    "58d69d086f644e89937347e1f9261d6f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "5a28babf4e2e4393bdc1a093034885ab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "673bd3773a374261a01cfc48081c27f3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7190c928edb040c3a523cdd2e3f45572": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_990741ff083d457587665d8f620b69c3",
       "IPY_MODEL_00fe6a550df547cea5b1e0d84c1a3f5f",
       "IPY_MODEL_fab8b1e3187841ee894b92859fa4821b"
      ],
      "layout": "IPY_MODEL_f9b0d916e1a64c2a9f384e42f3d5dcab"
     }
    },
    "7d293204dc1b4d97bb5ee670787c7b7d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "83f345f7424c43929d7a304cbfb6d0fe": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8cd9e9702e114ebc856f56975544ede8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "danger",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_22484000400842f0b6e245dc610acbba",
      "max": 128,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a66a5b4ff37d4dafa4ba3081aa1359f4",
      "value": 12
     }
    },
    "8cf462fa996c41b18fb4571e0a757363": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9233439bdd6746c28ad4a20ef47799f6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "990741ff083d457587665d8f620b69c3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_a78199650ecc47bd81f482a2671b563a",
      "placeholder": "​",
      "style": "IPY_MODEL_673bd3773a374261a01cfc48081c27f3",
      "value": "100%"
     }
    },
    "9a01f02fb99b4b81ac487d23bc5daf4a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_5a28babf4e2e4393bdc1a093034885ab",
      "placeholder": "​",
      "style": "IPY_MODEL_be07d518c21149d196c610fd57b1eaec",
      "value": " 957/? [00:18&lt;00:00, 51.31it/s]"
     }
    },
    "a66a5b4ff37d4dafa4ba3081aa1359f4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "a78199650ecc47bd81f482a2671b563a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "a89d790df59245fcaf26335d4903c9b4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_9233439bdd6746c28ad4a20ef47799f6",
      "max": 280,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_0e10428326bc436e8dbc079e89570bde",
      "value": 280
     }
    },
    "a972aba7913b48c6973ae27bff5b9d1d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7d293204dc1b4d97bb5ee670787c7b7d",
      "placeholder": "​",
      "style": "IPY_MODEL_ea8fa440f320435aa75c9bef75bc3f08",
      "value": ""
     }
    },
    "abb9bc76c0ce4634bd340be20c074b8c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_013d2a6b90144432bbfb15136235faba",
      "placeholder": "​",
      "style": "IPY_MODEL_2b82e42c34804b13bc83be4c7009d4e2",
      "value": ""
     }
    },
    "b077d7562d814df5b6d839464dd4122f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "b1e51beac50f4947a9dd235d8aa87603": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e0ddf3970b3e4248bc87d4649fa9c448",
      "placeholder": "​",
      "style": "IPY_MODEL_d7bdde54e2534c49a207540bd258d3ae",
      "value": "  9%"
     }
    },
    "b7c7a718a8654956947108969557ca83": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0b7866c29e5f4afe9b92de15f1b88c3e",
      "placeholder": "​",
      "style": "IPY_MODEL_333e84a304184c57af1821620ae80f6a",
      "value": " 12/128 [00:00&lt;00:01, 73.96it/s]"
     }
    },
    "be07d518c21149d196c610fd57b1eaec": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c9db4cd83b7b4f53a0fa93b8c365debd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_a972aba7913b48c6973ae27bff5b9d1d",
       "IPY_MODEL_22aa774ab39e4fd78b0ff08d430d2b5d",
       "IPY_MODEL_9a01f02fb99b4b81ac487d23bc5daf4a"
      ],
      "layout": "IPY_MODEL_19f846338f6b48c9930b58575641e5b8"
     }
    },
    "d7bdde54e2534c49a207540bd258d3ae": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e0ddf3970b3e4248bc87d4649fa9c448": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ea8fa440f320435aa75c9bef75bc3f08": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f837255914194dc792cf1514dee03dc5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0fe4ed7283c04496affe727c235d31c4",
      "placeholder": "​",
      "style": "IPY_MODEL_0c0c7229347b49ffbb9a0f7bd41199b9",
      "value": " 21020/? [21:30&lt;00:00, 15.32it/s, epoch=19, loss=2.61, val_loss=3.41]"
     }
    },
    "f9b0d916e1a64c2a9f384e42f3d5dcab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fab8b1e3187841ee894b92859fa4821b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8cf462fa996c41b18fb4571e0a757363",
      "placeholder": "​",
      "style": "IPY_MODEL_434ac4c51db74681942d2d3bd869b1df",
      "value": " 9714/9714 [00:00&lt;00:00, 236744.37it/s]"
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
